2012-03-24 47 views
127

我有4个不同的表,我想加入。该表的列结构如下:如何使用ID连接多个SQL表?

TableA - aID | nameA | dID 

TableB - bID | nameB | cID | aID 

TableC - cID | nameC | date 

TableD - dID | nameD 

的表A开始,我了解如何加入采用B表a和c,由于B对这些表的主键。我希望能够在TableA上连接表TableD。下面是我认为首先加入表A和B的SQL语句,然后加入,为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,我得到一个错误,“提交”未知:

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

回答

268

你想要更多的东西是这样的:

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。*复制所有匹配的主键ID列标签的? (问题没有说明需要输出什么,但通常你不想这么做) – 2015-06-24 08:40:18

+2

我可以问为什么'JOINTableC'是'ON' TableC.cID = TableB.cID'而不是'TableC.cID = TableA.cID'。我认为我们正在将'TableA'加入其他3个表格。 – emihir0 2015-10-28 23:48:33

4

您还没有加入TABLED只是从其中一个表中选择了FIELD TABLED。

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

简单的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; 
+0

不使用OP的表格结构?! – 2017-11-09 17:36:44