2010-02-12 35 views
2

使用:INNER JOIN有可能超过一张桌子吗?

SELECT * 
     FROM cart 
INNER JOIN dkb ON cart.id = dkb.id 
    WHERE cart.cookieId = '" . GetCartId() . "'" 

除了dkb表,我想INNER JOIN使用ON cart.id = cdkb.idcdkb表。

当cdkb添加到现有查询时,将如何显示?

回答

8

像这样的事情

SELECT * 
FROM Table1 t1 INNER JOIN 
Table2 t2 ON t1.ID = t2.ID INNER JOIN 
Table3 t3 ON t1.ID = t3.ID INNER JOIN 
.... 
TableN tn ON t1.ID = tn.ID 

因此,它看起来像

SELECT * 
FROM cart INNER JOIN 
     dkb ON cart.id = dkb.id INNER JOIN 
     cdkb ON cart.id = cdkb.id 
WHERE cart.cookieId = '" . GetCartId() . "' 
+0

好吧,我有一个包含一个URL cdkb.id或dkb.id然后该ID将激活cart.id取决于其中一个表的ID?那么如果在两个表中都找到了来自网址的ID呢?查询现在将如何激活哪个表? – jona 2010-02-13 18:39:17

1

您可以使用尽可能多的JOIN你想要的 - 只要他们添加到/连接查询的部分:

select * 
from cart 
    inner join dkb on cart.id = dkb.id 
    inner joion cdkb on cart.id = cdkb.id 
WHERE cart.cookieId = '...' 

而且,有关详细信息,请参阅本手册的这一部分:12.2.8.1. JOIN Syntax

+0

非常感谢你 – jona 2010-02-12 06:04:27

+0

有些人可能会争辩说,当联接的数量超过7时,可能会有数据库的规范化问题。 – 2010-02-15 01:33:54

0

完全按照你所描述的:

SELECT 
    * 
FROM 
    cart 

    JOIN dkb 
     ON cart.id = dkb.id 

    JOIN cdkb 
     on cart.id = cdkb.id 
WHERE 
    cart.cookieId = GetCartId() 

有关外连接,这里是一个链接discussing them

如果你这样做:

SELECT 
    cart.id cart_id, 
    dkb.id  dkb_id, 
    cdkb.id cdkb_id, 
    cart.*, 
    dkb.*, 
    cdkb.* 
FROM 
    cart 

    LEFT OUTER JOIN dkb 
     ON cart.id = dkb.id 

    LEFT OUTER JOIN cdkb 
     on cart.id = cdkb.id 
WHERE 
    cart.cookieId = GetCartId() 

这意味着你总是会得到每匹配记录来自购物车,来自的信息dkbcdkb表格只有在具有该ID的记录可用时才会出现,否则它们的字段将为NULL。我使用了一个LEFT OUTER JOIN,因为我希望表格的所有记录位于ON条件的左边。

一个FULL OUTER JOIN将意味着无论是车。*DKBcdkb领域可能为NULL。

肯定需要一段时间来感受一下OUTER JOIN语法,因为我可以说,因为我仍然错误地解释它(第一次)。 :-)

+0

我不确定,但感谢你伸出的手。 – jona 2010-02-12 05:38:30

+0

简单地按照我的方式格式化查询,使您的意图和结果更容易理解。 :-) – 2010-02-12 05:44:16

+0

该网址将有一个ID,然后该IDE将激活cart.id取决于其中一个表的ID?那么如果在两个表中都找到了来自网址的ID呢?查询现在将如何激活哪个表? – jona 2010-02-13 18:33:26

2

最佳做法是明确指定每个表的字段名称,并在每个表上使用ALIAS,例如

SELECT 
c.field1 AS c_field1 
, c.field2 AS c_field2 
, c.field3 AS c_field3 
, d.field1 AS d_field1 
, c2.field1 AS c2_field1 
FROM cart AS c 
INNER JOIN dkb AS d 
    ON (c.id = d.id) 
INNER JOIN ckdb AS c2 
    ON (c2.id = c.id) 
WHERE c.cookieID = '{VALUE}' 

当然这个glib的例子不会让别名的优点大放异彩;通常如果你有一个像CustomersBankAccountData这样的表名,那么一个别名是理想的。 ;)

EDITED:更新显示别名字段名称,这使得在这种情况下可能更有意义,甚至比表甚至别名。

+0

我认为这会很好,因为dkb和ckdb具有相同的字段名称,当在脚本中分配和区分它们时可能会产生冲突。 – jona 2010-02-12 06:03:42

+0

@jona>检查我编辑的文章是否有别名字段名称。 – bdl 2010-02-12 06:33:28

+0

根据已请求的表,该查询在php下面的索引将被激活? – jona 2010-02-13 18:31:59