2013-04-25 13 views
42

mam 3 tabele:MySQL LEFT JOIN 3 tabele

teraz chciałbym do listy każda osoba bez względu na strach jest powiązana z nich (może być wiele obaw, ale może być również brak). Tabela osób musi być pokazana, nawet jeśli dana osoba nie ma lęku z nimi związanego.

Chyba muszę zrobić LEFT JOIN, ale mój kod nie wydają się działać:

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

Co robię źle tutaj? Z góry dziękuję.

+0

Czy wypróbowałeś moje rozwiązanie? –

Odpowiedz

56

Próbujesz dołączyć Person_Fear.PersonID do Person_Fear.FearID - To naprawdę nie ma sensu. Prawdopodobnie chcesz coś takiego:

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 

łączy ten Persons na Fears pośrednictwem tabeli pośredniej Person_Fear. Ponieważ łączenie między Persons i Person_Fear jest LEFT JOIN, otrzymasz wszystkie zapisy Persons.

Alternatywnie:

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

Obniżono stawkę, ponieważ oryginalny post nie dotyczy wszystkich trzech tabel. Poprawiłeś to, ale masz zagnieżdżenie klauzul On. – Aheho

+0

+1 - Wiem, że to jak dotąd jedyna poprawna odpowiedź (przynajmniej po edycji). – Tom

+0

@Aheho True - jego definicje stołów nie były pierwotnie w blokach kodu, więc za nimi tęskniłem. Poprawiłem zagnieżdżenie, ale to sprawia, że ​​moja odpowiedź jest prawie identyczna z twoją, więc zaoferuję też alternatywę. –

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

spróbować

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

Ten działa dla mnie. –

12

Spróbuj to na pewno działa.

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

Nie mogłem tego uruchomić, ale rozwiązałem go, usuwając zmienne "AS" i po prostu używając pełnych nazw tabel. – RozzA

+0

Czy ktoś może komentować różnicę wydajności między lewymi, lewymi złączeniami a lewymi, wewnętrznymi złączeniami – anveshtummala