Hi,
klingt nach einem ganz banales Standardproblem: Es gibt Benutzer, jeder Benutzer hat keine, eine, oder mehrere Adressen (historisch). Aufgeteilt und normalisiert in zwei Tabellen mit folgender Definition:
Ich suche nach allen Benutzern
Ich will auf jeden Fall alle Benutzer haben, und wenn vorhanden auch noch eine Adresse
Ich brauche aber immer nur die letzte Adresse
das war nix. Also nach Adresse_ID sortieren
geht natürlich nicht, müsste ja vor dem GROUP BY sortiert werden. Also mit Subquery
oh mann, das macht mir den LEFT JOIN, der ja alle Benutzer rausgeben sollte, wieder kaputt, also
OK, sieht gut aus. Bei den paar Datensätzen ist das OK - ich hab das mal mit 200 Benutzern und 220 Adressen probiert - das dauert 2.5 Sekunden. Geht natürlich garnicht, da kommen noch mehr Datensätze rein und ich hätte noch viel mehr Tabellen zum joinen. Ich komm da nicht weiter, hat jemand einen Tipp? Auf der Suche nach "mysql join höchster Datensatz" etc. bin ich nur über die Subqueries gestolpert, vllt. fehlt mir ja nur das passende Stichwort.
Das Ganze ohne "OR A.Adresse_ID IS NULL" läuft übrigens in 0.02 Sekunden durch. Aber ich will halt auch die Datensätze ohne Adresse, wie beim LEFT JOIN.
Gruss, Christian
klingt nach einem ganz banales Standardproblem: Es gibt Benutzer, jeder Benutzer hat keine, eine, oder mehrere Adressen (historisch). Aufgeteilt und normalisiert in zwei Tabellen mit folgender Definition:
Code:
CREATE TABLE `Benutzer` ( `Benutzer_ID` INT NOT NULL PRIMARY KEY , `Name` VARCHAR( 250 ) NOT NULL ) ENGINE = MYISAM ; CREATE TABLE `Adresse` ( `Adresse_ID` INT NOT NULL PRIMARY KEY , `Benutzer_ID` INT NOT NULL , `Strasse` VARCHAR( 250 ) NOT NULL ) ENGINE = MYISAM ; INSERT INTO `benutzer` ( `benutzer_ID` ,`Name` ) VALUES (1 , 'Han Solo'), (2 , 'Chewbacca'), (3 , 'Yoda'); INSERT INTO `adresse` ( `Adresse_ID` ,`Benutzer_ID` ,`Strasse` ) VALUES (1 , '1', 'Corellia'), (2 , '1', 'Ylesia'), (3 , '1', 'Todesstern'), (4 , '2', 'Kashyyyk');
Code:
SELECT B.Benutzer_ID, B.Name FROM Benutzer B 1 Han Solo 2 Chewbacca 3 Yoda
Code:
SELECT B.Benutzer_ID, B.Name, A.Adresse_ID, A.Strasse FROM Benutzer B LEFT JOIN Adresse A ON A.Benutzer_ID = B.Benutzer_ID 1 Han Solo 1 Corellia 1 Han Solo 2 Ylesia 1 Han Solo 3 Todesstern 2 Chewbacca 4 Kashyyyk 3 Yoda NULL NULL
Code:
SELECT B.Benutzer_ID, B.Name, A.Adresse_ID, A.Strasse FROM Benutzer B LEFT JOIN Adresse A ON A.Benutzer_ID = B.Benutzer_ID GROUP BY B.Benutzer_ID 1 Han Solo 1 Corellia 2 Chewbacca 4 Kashyyyk 3 Yoda NULL NULL
Code:
SELECT B.Benutzer_ID, B.Name, A.Adresse_ID, A.Strasse FROM Benutzer B LEFT JOIN Adresse A ON A.Benutzer_ID = B.Benutzer_ID GROUP BY B.Benutzer_ID ORDER BY A.Adresse_ID 3 Yoda NULL NULL 1 Han Solo 1 Corellia 2 Chewbacca 4 Kashyyyk
Code:
SELECT B.Benutzer_ID, B.Name, A.Adresse_ID, A.Strasse FROM Benutzer B LEFT JOIN Adresse A ON A.Benutzer_ID = B.Benutzer_ID WHERE A.Adresse_ID = ( SELECT MAX(Adresse_ID) FROM Adresse A2 WHERE A2.Benutzer_ID = B.Benutzer_ID ) 1 Han Solo 3 Todesstern 2 Chewbacca 4 Kashyyyk
Code:
SELECT B.Benutzer_ID, B.Name, A.Adresse_ID, A.Strasse FROM Benutzer B LEFT JOIN Adresse A ON A.Benutzer_ID = B.Benutzer_ID WHERE ( A.Adresse_ID = ( SELECT MAX(Adresse_ID) FROM Adresse A2 WHERE A2.Benutzer_ID = B.Benutzer_ID ) OR A.Adresse_ID IS NULL ) 1 Han Solo 3 Todesstern 2 Chewbacca 4 Kashyyyk 3 Yoda NULL NULL
Das Ganze ohne "OR A.Adresse_ID IS NULL" läuft übrigens in 0.02 Sekunden durch. Aber ich will halt auch die Datensätze ohne Adresse, wie beim LEFT JOIN.
Gruss, Christian

Kommentar