2013-04-25 4 views
42

У меня есть 3 таблицы:MySQL LEFT JOIN 3 таблицы

Теперь я хотел бы перечислить каждый человек с любым страхом связан с ними (может быть несколько страхов, но и быть не может). Таблица лиц следует показывать, даже если у человека нет страха, связанного с ними.

Я думаю, что нужно сделать LEFT JOIN, но мой код не похоже на работу:

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

Что я здесь делаю неправильно? Заранее спасибо.

+0

Вы пробовали мое решение? –

ответ

56

Вы пытаетесь присоединиться к Person_Fear.PersonID на Person_Fear.FearID - Это не имеет смысла. Вы, вероятно, хотите что-то вроде:

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 

Это соединяющую Persons на Fears через промежуточную таблицу Person_Fear. Поскольку соединение между Persons и Person_Fear составляет LEFT JOIN, вы получите все Persons записей.

В качестве альтернативы:

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

Я проигнорировал, потому что вы оригинальный пост не ссылался на все 3 таблицы. Вы исправили это, но у вас есть вложенность в предложениях On. – Aheho

+0

+1 - Я знаю, это выглядит как единственный правильный ответ до сих пор (после любых изменений, по крайней мере). – Tom

+0

@Aheho True - его определения таблиц не были в блоках кода изначально, поэтому я пропустил их. Я исправил вложенность, но это делает мой ответ в значительной степени идентичным вашему, поэтому я также предложу альтернативу. –

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

попробовать это

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

Это работает для меня. –

12

Попробуйте это, безусловно, работает.

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

Я не мог заставить это работать, но я решил его, удалив переменные 'AS' и просто используя полные имена таблиц. – RozzA

+0

Может ли кто-нибудь прокомментировать разницу в производительности между левым, левым соединением против Left, Inner join – anveshtummala