Tach!
Ich brauche also zwei SELECT Abfragen.
Die erste liest normal die Tabelle 1 aus
SELECT a.id, a.name FROM table1 a ORDER BY a.id DESC
Die 2. Select Abfrage Gruppiert zusammen, und es gibt nur einen Eintrag wenn mehrere Felder existieren.
SELECT b.text FROM table2 b GROUP BY b.text
Gruppieren ist nicht der richtig Weg, weil du damit nur zufällig und der Laxheit MySQLs dein gewünschtes Ergebenis erhältst.
So jetzt kommt der Punkt an dem ich es nicht verstehe. Wie bekomme ich die beiden SELECT Abfrage zusammen?
Du kannst Subselects an verschiedenen Stellen anwenden. (Ich kürze die
SELECT x, (SELECT einFeld FROM ...) FROM ...
Mit diesem Subselect kannst du genau einen Wert in die Ergebniszeile einfügen, weil an dieser Position immer nur ein Feld angegeben werden kann. Die Subquery darf dann auch nur einen einzelnen Wert als Ergebnis bringen.
SELECT a.x, b.x, b.y, b.z FROM a, (SELECT x, y, z FROM b) b WHERE ...
SELECT a.x, b.x, b.y, b.z FROM a LEFT JOIN (SELECT x, y, z FROM b) b ON ... WHERE ...
Bei diesen Varianten kannst du mehrere Werte beisteuern, weil an dieser Position normalerweise Tabellen mit egal wievielen Feldern stehen. Wieviele Werte davon genommen werden, entscheidet sich erst in der SELECT-Klausel.
Und nun kommt deine Aufgabenstellung, die du eventuell für das Posten hier gekürzt hast. Wenn du wirklich aus b nur eien Wert brauchst, so wie das in deinen Statements zu sehen ist, wird alles gut. Die Subquery muss aus b die zugehörigen (korrelierenden) Datensätze zur a.id ermitteln, sie nach der Aktualität sortieren und auf 1 limitieren. Von diesem Datensatz gibst du in der SELECT-Klausel genau einen Feldnamen an.
Wenn du stattdessen aus b mehrere Werte benötigst, dann kannst du nur die zweite Variante nehmen. Und nun wird die Sache komplexer als ich es mir bei meiner ersten Antwort auf die Schnelle vorgestellt hatte. Um a mit b zu verknüpfen brauchst zwar bei dieser Variante keine Korrelation sondern nur einen Join und die Joinbedingung, aber wenn wir es mal richtig und ohne Gruppierung machen wollen, brauchen wir nun in der Subquery auf b noch eine weitere Subquery mit Korrelation und auch wieder auf b. Das Prinzip hat Vinzenz schon zu verlinken versucht, was ihm aber misslang: </archiv/2006/7/t133015/#m861544>. Insgesamt sieht das dann so aus:
SELECT a.felder, b.felder
FROM tabelle1 a LEFT JOIN
( SELECT felder FROM tabelle2 b1 WHERE zeit = (SELECT MAX(zeit) FROM tabelle2 b2 WHERE b1.id = b2.id) ) b ON a.id=b.id
Diese Lösung ist aber nicht universell, denn sie setzt voraus, dass der Zeit-Wert über die gesamte Tabelle eindeutig ist. Wenn das bei dir nicht der Fall ist (falls du überhaupt diese Variante benötigst), müsste Vinzenz (oder ein anderer Datenbankexperte) nochmal ran und seinen Ärmel untersuchen, ob er aus selbigem eine bessere Lösung schütteln kann.
dedlfix.