Làm cách nào tôi có thể tham gia nhiều bảng SQL bằng ID?


141

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:

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 THAM GIA bảng a và c bằng cách sử dụng b, vì b có Khóa chính cho các bảng đó. Tôi cũng 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 trước tiên tham gia bảng A và B, sau đó kết hợp nó với 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 liên kết khác, để bao gồm D, tôi gặp phải một lỗi mà 'TableD' không xác định:

 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())) 

Câu trả lời:


302

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ả bạn phải làm là thực hiện một tham gia 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 sự nhầm lẫn khi cố gắng đọc mã. Lồng đúng cách là cách tốt nhất để làm cho mã của bạn dễ đọc và tách ra.


2
sẽ không chọn bảngN. * sao chép tất cả ID khóa chính phù hợp trong nhãn cột? (câu hỏi không xác định đầu ra nào là mong muốn nhưng thông thường bạn sẽ không muốn làm điều này tôi nghĩ)
Heather Stark

6
Tôi có thể hỏi tại sao JOINTableCON TableC.cID = TableB.cIDvà không TableC.cID = TableA.cID. Tôi giả sử chúng tôi đang tham gia TableAvào 3 bảng khác.
emihir0

25
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()

4

Bạn chưa tham gia TableD, chỉ chọn TableD FIELD ( dID) từ một trong các bảng.


2

Mã tham gia đơn giản THAM GIA 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;

Không sử dụng cấu trúc bảng của OP?!
Istiaque Ahmed
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.