如何使用ID连接多个SQL表?

Sun*_*Sun 137 mysql sql join

我有4个不同的表,我想加入.这些表的结构如下:

TableA - aID | nameA | dID

TableB - bID | nameB | cID | aID

TableC - cID | nameC | date

TableD - dID | nameD
Run Code Online (Sandbox Code Playgroud)

从表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())) 
Run Code Online (Sandbox Code Playgroud)

当我尝试添加另一个连接时,要包含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())) 
Run Code Online (Sandbox Code Playgroud)

Jus*_*ony 293

你想要更像这样的东西:

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()) 
Run Code Online (Sandbox Code Playgroud)

在您的示例中,您实际上并未包括TableD.您所要做的就是像以前一样执行另一次连接.

注意:您会注意到我删除了许多括号,因为在您拥有它们的大多数情况下它们并不是必需的,并且在尝试读取代码时只会增加混淆.正确的嵌套是使代码可读和分离的最佳方法.

  • 我可能会问为什么`JOINTableC`是'ON``TableC.cID = TableB.cID`而不是`TableC.cID = TableA.cID`.我假设我们将`TableA`加入到其他3个表中. (4认同)
  • 不会选择tableN.*复制列标签中所有匹配的主键ID?(问题没有说明需要什么输出,但通常你不想这样做我认为) (2认同)

Nem*_*den 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()
Run Code Online (Sandbox Code Playgroud)