2012-03-24 45 views
127

Tôi có 4 bảng khác nhau mà tôi muốn tham gia. Các bảng được cấu trúc với các cột như sau:Tôi có thể tham gia nhiều bảng SQL bằng cách sử dụng ID như thế nào?

TableA - aID | nameA | dID 

TableB - bID | nameB | cID | aID 

TableC - cID | nameC | date 

TableD - dID | nameD 

Bắt đầu với bảng A, tôi hiểu cách JOIN bảng a và c bằng b, vì b có Khóa chính cho các bảng đó. Tôi muốn có thể tham gia bảng TableD trên TableA. Dưới đây là câu lệnh SQL của tôi rằng lần đầu tiên tham gia bảng A và B, sau đó tham gia đó để C:

SELECT TableA.*, TableB.*, TableC.* FROM (TableB INNER JOIN TableA 
ON TableB.aID= TableA.aID) 
INNER JOIN TableC ON(TableB.cID= Tablec.cID) 
WHERE (DATE(TableC.date)=date(now())) 

Khi tôi cố gắng để thêm một tham gia, bao gồm D, tôi nhận được một lỗi đó là thảo luận từ 'không rõ:

SELECT TableA.*, TableB.*, TableC.*, TableD.* FROM (TableB INNER JOIN TableA 
    ON TableB.aID= TableA.aID) 
    INNER JOIN TableC ON(TableB.cID= Tablec.cID) 
    INNER JOIN TableA ta ON(ta.dID= TableD.dID) 
    WHERE (DATE(TableC.date)=date(now())) 

Trả lời

268

Bạn muốn một cái gì đó như thế này:

SELECT TableA.*, TableB.*, TableC.*, TableD.* 
FROM TableA 
    JOIN TableB 
     ON TableB.aID = TableA.aID 
    JOIN TableC 
     ON TableC.cID = TableB.cID 
    JOIN TableD 
     ON TableD.dID = TableA.dID 
WHERE DATE(TableC.date)=date(now()) 

Trong ví dụ của bạn, bạn không thực sự bao gồm TableD. Tất cả những gì bạn phải làm là thực hiện một phép nối khác giống như bạn đã làm trước đây. Một lưu ý: bạn sẽ nhận thấy rằng tôi đã xóa nhiều dấu ngoặc đơn của bạn vì chúng thực sự không cần thiết trong hầu hết các trường hợp bạn có chúng và chỉ thêm nhầm lẫn khi cố gắng đọc mã. Lồng ghép đúng cách là cách tốt nhất để làm cho mã của bạn có thể đọc được và tách ra.

+2

sẽ không chọn tableN. * Lặp lại tất cả những phù hợp với chính ID chủ chốt trong các nhãn cột? (câu hỏi đã không xác định những gì đầu ra là mong muốn nhưng thường bạn sẽ không muốn làm điều này tôi nghĩ) –

+2

Tôi có thể hỏi tại sao 'JOINableC' là' ON' 'TableC.cID = TableB.cID' và không' TableC.cID = TableA.cID'. Tôi cho rằng chúng tôi đang tham gia 'TableA' với 3 bảng khác. – emihir0

4

Bạn chưa tham gia TABLED chỉ chọn FIELD TABLED từ một trong các bảng.

20
SELECT 
    a.nameA, /* TableA.nameA */ 
    d.nameD /* TableD.nameD */ 
FROM TableA a 
    INNER JOIN TableB b on b.aID = a.aID 
    INNER JOIN TableC c on c.cID = b.cID 
    INNER JOIN TableD d on d.dID = a.dID 
WHERE DATE(c.`date`) = CURDATE() 
1

Simple INNER JOIN đang XEM ....

CREATE VIEW room_view 
AS SELECT a.*,b.* 
FROM j4_booking a INNER JOIN j4_scheduling b 
on a.room_id = b.room_id; 
+0

Không sử dụng cấu trúc bảng của OP?! –

Các vấn đề liên quan