2013-04-25 86 views
42

Tôi có 3 bảng:MySQL LEFT JOIN 3 bảng

Bây giờ tôi muốn liệt kê tất cả mọi người với bất cứ điều gì sợ hãi được liên kết với họ (có thể có nhiều lo ngại nhưng cũng có thể không có). Bảng người phải được hiển thị ngay cả khi một người không có sợ hãi liên quan đến họ.

Tôi nghĩ rằng tôi cần phải làm một LEFT JOIN, nhưng mã của tôi dường như không làm việc:

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

Tôi đang làm gì sai ở đây? Cảm ơn trước.

+0

bạn đã thử giải pháp của mình chưa? –

Trả lời

56

Bạn đang cố gắng tham gia Person_Fear.PersonID lên Person_Fear.FearID - Điều này không thực sự hợp lý. Bạn có thể muốn một cái gì đó như:

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 

này tham gia vào PersonsFears qua bảng trung gian Person_Fear. Bởi vì sự tham gia giữa PersonsPerson_FearLEFT JOIN, bạn sẽ nhận được tất cả hồ sơ Persons.

Hoặc:

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

Tôi đã bỏ phiếu vì bạn đã đăng bài gốc không tham chiếu cả 3 bảng. Bạn đã sửa chữa điều đó, nhưng bạn có sự làm tổ của các mệnh đề On sai. – Aheho

+0

+1 - Tôi biết, điều này có vẻ như chỉ là câu trả lời chính xác cho đến nay (sau khi chỉnh sửa ít nhất). – Tom

+0

@Aheho True - định nghĩa bảng của ông không có trong các khối mã ban đầu vì vậy tôi đã bỏ lỡ chúng. Tôi đã sửa chữa làm tổ nhưng điều này làm cho câu trả lời của tôi khá giống với câu trả lời của bạn, vì vậy tôi cũng sẽ đưa ra một giải pháp thay thế. –

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

thử này

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

Cái này phù hợp với tôi. –

12

Hãy thử điều này chắc chắn làm việc.

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

Tôi không thể làm việc này, nhưng tôi đã giải quyết nó bằng cách xóa các biến 'AS' và chỉ sử dụng tên bảng đầy đủ – RozzA

+0

Có thể ai đó nhận xét về sự khác biệt về hiệu suất giữa các lần tham gia Trái, Trái so với Trái, Bên trong – anveshtummala