2009-08-02 26 views
8

Ho una situazione in cui ho una tabella di titoli (t1) e un'altra tabella con più collegamenti che fanno riferimento a questi titoli (t2) in una relazione uno a molti.MySQL Unire sintassi per uno a molti rapporti

Quello che voglio è l'elenco completo dei titoli restituiti con un flag che indica se c'è un collegamento specifico associato ad esso.

LEFT JOIN e Gruppo By:

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; 

Questo è più vicino mi dà sia la prima link_id o NULL nella colonna RefID.

Ora, come posso limitare i risultati se ho uno specifico link_id piuttosto che consentire a t2 di eseguire l'intero set di dati?

Se posso aggiungere una clausola WHERE, ad esempio:

WHERE t2.link_id = 123 

ho solo i pochi record in cui le partite link_id ma ho ancora bisogno il set completo di titoli restituiti con NULL nella colonna RefID a meno link_id = 123.

la speranza che qualcuno possa aiutare

risposta

13

Anziché nella clausola WHERE, mettere i criteri nella clausola LEFT JOIN:

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

Grazie tanto per questo. Funziona perfettamente. :) – Das123

4

Metti nella condizione di join per la seconda tabella

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

Non dovrebbe essere: 'ON t1.id = t2.title_id'? O prenderà automaticamente il pk quando si specifica la tabella? –

Problemi correlati