Stefan: Aus 2 mach 1? Subquery gesucht

Hi,

kann ich aus diesen beiden Queries auch 1 machen?

  
$query=("  
select  
t1.ID,  
t2.Nummer  
FROM tabelle1 t1  
JOIN  
tabelle2 t2 ON t1.ID = t2.ID  
WHERE  
t1.Spalte1 != 1");  
$result=mysql_query($query);  
if ($result==FALSE) {  
error();  
}  
  
while ($row=mysql_fetch_row($result)) {  
$query_u="SELECT  
Spalte3,  
Spalte4  
FROM Tabelle3  
WHERE  
Spalte5 = $row[0] AND Spalte6 = $row[1]  
";  
...  
}  

Grüß euch, Stefan

  1. Einfach Tabelle3 auch noch mit rein joinen? Oder wo genau siehst du das Problem?

    1. Einfach Tabelle3 auch noch mit rein joinen? Oder wo genau siehst du das Problem?

      Na das wär ja kein Problem.
      Aber ich würde lieber eine Subquery haben, weil der JOIN zu arbeitsintensiv ist.

      Grüße, Stefan

      1. Bist du da ganz sicher? Subqueries sind doch im Prinzip das selbe.
        Und wie du an einer anderen Stelle schreibst, hast du ja sowieso eine 1:1 Beziehung. Dann lässt du das doch lieber auf einmal joinen, statt für jedes Ergebnis aus dem ersten Teil eine neue Query für den zweiten Teil zu starten.

  2. Hi,

    kann ich aus diesen beiden Queries auch 1 machen?
    [...]

    Das kommt drauf an, in welcher Beziehung die beiden Tabellen zueinander stehen.
    Wenn einem Tupel (t1.ID, t2.Nummer) genau ein Eintrag in Tabelle3 gegenübersteht, kannst du es "einfach" als Subquery schreiben.

    Hast du dagegen z.B. eine 1:n Beziehung, dann würdest du pro Ergebniszeile des ersten Queries ja eine Menge an Ergebnis-Zeilen des zweiten Queries. Da müsstest du diese, wenn du es in einem Query haben willst, diese mit einer Aggregatfunktion, z.B. GROUP_CONCAT, bearbeiten.

    Bis die Tage,
    Matti

    1. Hi,

      Hast du dagegen z.B. eine 1:n Beziehung, dann würdest du pro Ergebniszeile des ersten Queries ja eine Menge an Ergebnis-Zeilen des zweiten Queries. Da müsstest du diese, wenn du es in einem Query haben willst, diese mit einer Aggregatfunktion, z.B. GROUP_CONCAT, bearbeiten.

      Es sollte eigentlich eine 1:1 Beziehung sein...

      Wie würde dann das Subselect aussehen?

      Und was wäre, wenn versehentlich eine 1:n Beiehung aufträte?

      Grüß Dich, Stefan

      1. Hi,

        Wie würde dann das Subselect aussehen?

        Eigentlich keine Raketenphysik, dass könntest du anhand der Dokumentation deines DBMS eigentlich herausfinden. Aber ich will mal nicht so sein:

          
        SELECT  
          t1.ID,  
          t2.Nummer,  
          (  
            SELECT Spalte3  
            FROM Tabelle3  
            WHERE Tabelle3.Spalte5 = t1.ID AND Tabelle3.Spalte6 = t2.Nummer  
          ) AS Spalte3,  
          (  
            SELECT Spalte4  
            FROM Tabelle3  
            WHERE Tabelle3.Spalte5 = t1.ID AND Tabelle3.Spalte6 = t2.Nummer  
          ) AS Spalte4  
        FROM tabelle1 t1  
         JOIN tabelle2 t2 ON t1.ID = t2.ID  
        WHERE t1.Spalte1 != 1  
        
        

        Und was wäre, wenn versehentlich eine 1:n Beiehung aufträte?

        Es kommt drauf an. Obiges Statement würde eine Fehlermeldung liefern, welche etwa so lauten würde: "Subquery returns more than one row".
        Die Lösung wäre, dafür zu sorgen, dass nur ein Result in den Subqueries zurückkommt. Entweder also die Subqueries einschränken mit ORDER BY/LIMIT, oder eine Aggregatfunktion verwenden (z.B. MAX/MIN/..., wenn du ein bestimmtes haben willst, oder z.B. GROUP_CONCAT, wenn du alle (mit einem optionalen Separierer) haben willst).

        Bis die Tage,
        Matti

        1. Hi Matti,

          Eigentlich keine Raketenphysik, dass könntest du anhand der Dokumentation deines DBMS eigentlich herausfinden. Aber ich will mal nicht so sein

          Sehr vielen Dank.
          Denn ich hatte bereits versucht, es selber herauszufinden und nicht geschafft.

          Und auch zu Deiner Lösung habe ich eine Frage.

          SELECT
            t1.ID,
            t2.Nummer,
            (
              SELECT Spalte3
              FROM Tabelle3
              WHERE Tabelle3.Spalte5 = t1.ID AND Tabelle3.Spalte6 = t2.Nummer
            ) AS Spalte3,
            (
              SELECT Spalte4
              FROM Tabelle3
              WHERE Tabelle3.Spalte5 = t1.ID AND Tabelle3.Spalte6 = t2.Nummer
            ) AS Spalte4
          FROM tabelle1 t1
          JOIN tabelle2 t2 ON t1.ID = t2.ID
          WHERE t1.Spalte1 != 1

          
          >   
            
          Muß man wirklich 2 subselects machen, wenn man Spalte 3+4 einbeziehen will?  
            
          Danke und Grüße, Stefan  
            
          
          
          1. Hi,

            Muß man wirklich 2 subselects machen, wenn man Spalte 3+4 einbeziehen will?

            Ich kenne keine saubere andere Lösung.

            Eine Alternative wäre, Spalte 3 und 4 DB-seitig zusammenzuklatschen (z.B. mit CONCAT_WS('#', Spalte3, Spalte4), wobei du als Separator (hier '#') ein Zeichen brauchst, was nicht in den Daten vorkommt) und dann anwendungsseitig diese Ergebnisspalte wieder auseinandernimmst anhand des gewählten Trenners.

            Bis die Tage,
            Matti