2010-02-12 64 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