ฉันจะเข้าร่วม SQL หลายตารางโดยใช้ ID ได้อย่างไร


141

ฉันมี 4 ตารางที่แตกต่างกันที่ฉันต้องการเข้าร่วม ตารางมีโครงสร้างที่มีคอลัมน์ดังนี้

TableA - aID | nameA | dID

TableB - bID | nameB | cID | aID

TableC - cID | nameC | date

TableD - dID | nameD

เริ่มต้นด้วยตาราง A ฉันเข้าใจวิธีเข้าร่วมตาราง a และ c โดยใช้ b เนื่องจาก b มีคีย์หลักสำหรับตารางเหล่านั้น ฉันต้องการที่จะเข้าร่วม TableD บน TableA เช่นกัน ด้านล่างนี้เป็นคำสั่ง SQL ของฉันที่แรกเข้าร่วมตาราง A และ B จากนั้นเข้าร่วมที่ 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())) 

เมื่อฉันพยายามที่จะเพิ่มเข้าร่วมอีกครั้งเพื่อรวม D ฉันได้รับข้อผิดพลาดที่ 'TableD' ไม่เป็นที่รู้จัก:

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

คำตอบ:


303

คุณต้องการอะไรแบบนี้:

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

TableDในตัวอย่างของคุณคุณจะไม่จริงรวมทั้ง สิ่งที่คุณต้องทำคือการเข้าร่วมอื่นเหมือนกับที่คุณเคยทำมาก่อน

หมายเหตุ: คุณจะสังเกตเห็นว่าฉันลบวงเล็บจำนวนมากเนื่องจากไม่จำเป็นในกรณีส่วนใหญ่ที่คุณมีอยู่และเพิ่มความสับสนเมื่อพยายามอ่านรหัสเท่านั้น การซ้อนที่เหมาะสมเป็นวิธีที่ดีที่สุดในการทำให้โค้ดของคุณสามารถอ่านและแยกออกได้


2
จะไม่เลือก tableN. * ซ้ำรหัสคีย์หลักที่ตรงกันทั้งหมดในป้ายชื่อคอลัมน์หรือไม่ (คำถามไม่ได้ระบุสิ่งที่ต้องการเป็นผลผลิต แต่โดยปกติแล้วคุณไม่ต้องการทำสิ่งนี้ฉันคิดว่า)
Heather Stark

6
ผมอาจจะถามว่าทำไมJOINTableCเป็นและไม่ได้ON TableC.cID = TableB.cID TableC.cID = TableA.cIDฉันคิดว่าเรากำลังเข้าร่วมTableAกับอีก 3 ตาราง
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()


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.