2009-08-02 5 views
8

Ich habe eine Situation, wo ich eine Tabelle von Titeln (t1) und eine andere Tabelle mit mehreren Links, die diese Titel (t2) in einer Eins-zu-viele Beziehung verweisen.MySQL Join-Syntax für eine zu viele Beziehung

Was ich will, ist die vollständige Liste der Titel mit einem Flag zurückgegeben, die angibt, ob eine bestimmte Verknüpfung zugeordnet ist.

LEFT JOIN und Gruppieren nach:

SELECT 
    t1.id 
    , t1.title 
    , t2.link_id AS refId 
FROM 
    t1 
    LEFT JOIN t2 
     ON (t1.id = t2.title_id) 
GROUP BY t1.id; 

Dies liegt nahe, wie es mir gibt entweder die erste link_id oder NULL in der refId Spalte.

Nun, wie schränke ich die Ergebnisse ein, wenn ich eine bestimmte link_id habe, anstatt t2 den gesamten Datensatz durchlaufen zu lassen?

Wenn ich hinzufügen, eine Klausel WHERE, zum Beispiel:

WHERE t2.link_id = 123 

ich nur die wenigen Aufzeichnungen, wo die link_id Matches aber ich muss noch den vollen Satz von Titeln mit NULL in der refId Spalte zurückgegeben, es sei denn link_id = 123.

Hoffnung jemand

Antwort

13

Statt in der WHERE-Klausel helfen können, setzen Sie Ihre Kriterien in der LEFT JOIN-Klausel:

SELECT 
    t1.id 
    , t1.title 
    , t2.link_id AS refId 
FROM 
    t1 
    LEFT JOIN t2 
     ON t1.id = t2.title_id AND t2.link_id = 123 
GROUP BY t1.id; 
+0

Thankyou beide dafür. Funktioniert perfekt. :) – Das123

4

es in der Join-Bedingung Setzen Sie für die zweite Tabelle

SELECT t1.id, t1.title, t2.link_id as refId 
FROM t1 
LEFT JOIN t2 ON t1 = t2.title_id AND t2.link_id = 123 
GROUP BY t1.id; 
+0

Sollte es nicht sein: 'ON t1.id = t2.title_id'? Oder nimmt es automatisch den PK, wenn die Tabelle spezifiziert wird? –

Verwandte Themen