2013-04-25 5 views
42

Ho 3 tabelle:MySQL LEFT JOIN 3 tavoli

Ora vorrei elencare ogni persona con tutto ciò che la paura è legata alla loro (può essere più paure, ma può anche essere nessuno). La tabella delle persone deve essere mostrata anche se una persona non ha paura associata a loro.

Penso che ho bisogno di fare un LEFT JOIN, ma il mio codice non sembra funzionare:

SELECT persons.name, 
     persons.ss, 
     fears.fear 
FROM persons 
     LEFT JOIN fears 
       ON person_fear.personid = person_fear.fearid 

che cosa sto facendo male qui? Grazie in anticipo.

+0

hai provato la mia soluzione? –

risposta

56

Si sta tentando di unire Person_Fear.PersonID su Person_Fear.FearID - Questo non ha molto senso. Probabilmente si desidera qualcosa di simile:

SELECT Persons.Name, Persons.SS, Fears.Fear FROM Persons 
LEFT JOIN Person_Fear 
    INNER JOIN Fears 
    ON Person_Fear.FearID = Fears.FearID 
ON Person_Fear.PersonID = Persons.PersonID 

Questo unisce Persons sul Fears tramite la tabella intermedia Person_Fear. Poiché il join tra Persons e Person_Fear è un LEFT JOIN, avrai tutti i record Persons.

alternativa:

SELECT Persons.Name, Persons.SS, Fears.Fear FROM Persons 
LEFT JOIN Person_Fear ON Person_Fear.PersonID = Persons.PersonID 
LEFT JOIN Fears ON Person_Fear.FearID = Fears.FearID 
+0

Ho downvoted perché il tuo post originale non ha fatto riferimento a tutti e 3 i tavoli. L'hai corretto, ma hai sbagliato l'annidamento delle clausole On. – Aheho

+0

+1 - Lo so, sembra l'unica risposta corretta finora (dopo ogni modifica almeno). – Tom

+0

@Aheho True - le sue definizioni di tabella non erano originariamente in blocchi di codice quindi mi mancavano. Ho corretto il nesting ma questo rende la mia risposta praticamente identica alla tua, quindi offrirò anche un'alternativa. –

7
Select 
    p.Name, 
    p.SS, 
    f.fear 
From 
    Persons p 
left join 
     Person_Fear pf 
    inner join 
     Fears f 
    on 
     pf.fearID = f.fearID 
on 
    p.personID = pf.PersonID 
17

provare questo

SELECT p.Name, p.SS, f.Fear 
    FROM Persons p 
    LEFT JOIN Person_Fear fp 
    ON p.PersonID = fp.PersonID 
    LEFT JOIN Fear f 
    ON f.FearID = fp.FearID 
+0

Questo funziona per me. –

12

Prova questa sicuramente lavorare.

SELECT p.PersonID AS person_id, 
    p.Name, p.SS, 
    f.FearID AS fear_id, 
    f.Fear 
    FROM person_fear AS pf 
     LEFT JOIN persons AS p ON pf.PersonID = p.PersonID 
     LEFT JOIN fears AS f ON pf.PersonID = f.FearID 
    WHERE f.FearID = pf.FearID AND p.PersonID = pf.PersonID 
+0

Non riuscivo a far funzionare tutto questo, ma l'ho risolto rimuovendo le variabili 'AS' e usando solo i nomi completi della tabella – RozzA

+0

Qualcuno può commentare la differenza di prestazioni tra Left, Left joins vs Left, Inner join – anveshtummala