我想加入4个不同的表。这些表的结构如下:
TableA - aID | nameA | dID
TableB - bID | nameB | cID | aID
TableC - cID | nameC | date
TableD - dID | nameD
从表A开始,我理解如何使用b来连接表a和c,因为b具有这些表的主键。我希望能够在TableA上加入表TableD。下面是我的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()))
答案 0 :(得分:287)
你想要更像这样的东西:
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
。您所要做的就是像以前一样执行另一次连接。
注意:您会注意到我删除了许多括号,因为在您拥有它们的大多数情况下它们并不是必需的,并且在尝试读取代码时只会增加混淆。正确的嵌套是使代码可读和分离的最佳方法。
答案 1 :(得分:24)
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()
答案 2 :(得分:4)
您尚未加入TableD,只是从其中一个表中选择了TableD FIELD(dID
)。
答案 3 :(得分:2)
简单的INNER JOIN VIEW代码....
CREATE VIEW room_view
AS SELECT a.*,b.*
FROM j4_booking a INNER JOIN j4_scheduling b
on a.room_id = b.room_id;