JOIN Statement

Hallo,
ich habe gerade Probleme mit einem LEFT JOIN.
Bisher ist der query so:

'SELECT t1.*, t2.code
FROM (table1 t1)
LEFT JOIN table2 t2 USING(name)
WHERE user = 1;

nun möchte ich die Abfrage noch dahingehend erweitern, dass von Tabelle Zwei stets nur der letzte Wert von Code abgefragt wird. Wie mache ich das? :slight_smile:

Liebe Grüße,
Seb

Was heißt “nur der letzte Wert von Code”?
Wenn du eine id mit auto_increment hast, dann geht das doch?

dev.mysql.com/doc/refman/5.5/en/ … p-row.html

Vielen Dank.
Jetzt habe ich ein weiteres Problem.
Wie kann ich die Daten aus Tabelle1 die kein äquivalent in Tabelle2 haben trotzdem mit Abfragen?

Indem du genau andersherum JOINst.

okay, ich habe jetzt folgenden query:

SELECT t1 . * , t2.code AS code FROM t1 LEFT JOIN t2 ON t1.ordernumber = t2.ordernumber AND t2.queueID IN (SELECT MAX(queueID) FROM t2 GROUP BY name) WHERE `user` = 1 GROUP BY name

macht das so sinn oder gibts da noch was zu optimieren? :slight_smile:

und ich habe jetzt noch eine tabelle3, die eine lesbare nachricht zu den codes hat. diesen möchte ich auch mitladen.
wieso funktioniert der folgende query nicht?

SELECT t1 . * , t2.code AS code, t3.msg FROM t1 LEFT JOIN t2 ON t1.ordernumber = t2.ordernumber AND t2.queueID IN (SELECT MAX(queueID) FROM t2 GROUP BY name) LEFT JOIN t3 ON t3.code = t2.code WHERE `user` = 1 GROUP BY name

Liebe Grüße,
Seb

Du schränkst in deiner Subquery die Auswahl gar nicht ein …

so besser? der user ist später nicht immer 1 sondern unterschiedlich.

SELECT t1 . * , t2.code AS code FROM t1 LEFT JOIN t2 ON t1.ordernumber = t2.ordernumber AND t2.queueID IN (SELECT MAX(queueID) FROM t2 WHERE ordernumber IN (SELECT ordernumber FROM t1 WHERE user = 1) GROUP BY name) WHERE `user` = 1 GROUP BY name

Du selektierst die odernumber doch schon in der äußeren Query – da braucht es keinen weiteren (Sub-)Subselect mehr innen um diese zu bestimmen, sondern nur eine Referenzierung auf erstere.

Meinst du das dann so?

SELECT t1 . * , t2.code AS code FROM t1 LEFT JOIN t2 ON t1.ordernumber = t2.ordernumber AND t2.queueID IN (SELECT MAX(queueID) FROM t2 WHERE t1.ordernumber = t2.ordernumber GROUP BY name) WHERE `user` = 1 GROUP BY name

order gibt es eine möglichkeit den teil rauszulassen?

t2.queueID IN (SELECT MAX(queueID) FROM t2 WHERE t1.ordernumber = t2.ordernumber GROUP BY name)