2012-06-22 61 views
2

我有3個表需要在SQL語句中鏈接(如果有幫助,我使用PHP - MySQL)。我需要提取的所有訂單,其中來自第三個表供應商字段等於「3」,如下:SQL 3表加入

orders - orders_items - items 

order_id -> order_id 
      item_id  -> id 
          vendor = '3' 

有很多方法可以做到這一點,我相信,隨着各種WHERE並加入,但我問了相比最有效的方法,下面我的方法:

SELECT 
    orders.order_id 
FROM 
    items, orders 
INNER JOIN 
    orders_items 
ON 
    orders.order_id = orders_items.order_id 
WHERE 
    orders_items.item_id = items.id 
AND 
    items.vendor = '3' 
GROUP BY 
    orders.order_id 
+0

我想你寫的是正確的。您可以使用JOIN語句連接表,也可以在where語句中連接表。您已經在單個語句中使用了兩者(兩者在語法上都是相同的) –

回答

2

使用,符號並不被普遍認爲是不好的做法,但我認爲這是一個相當分鐘現在同意這一點。即使是Oracle(其用戶似乎是該語法中最支持的人)也不推薦使用它。

但我不知道任何人誰將支持混合,和ANSI-92的JOIN語法。這只是要求麻煩。

SELECT 
    orders.order_id 
FROM 
    orders 
INNER JOIN 
    orders_items 
    ON orders.order_id = orders_items.order_id 
INNER JOIN 
    items 
    ON orders_items.item_id = items.id 
WHERE 
    items.vendor = '3' 
GROUP BY 
    orders.order_id 

SQL Optimiser沒有按照您指定的那樣執行。 SQL只是一個表達式,SQL優化器根據該表達式計算出適合的結果。通過像上面那樣編寫它,優化器將會發現它被看作是過濾,連接,排序等的最佳順序,以及哪些是用於完成這些任務的最佳索引等。


編輯

我注意到人們在GROUP BY支持DISTINCT

雖然DISTINCT稍短,但沒有更快,並且對您進行限制。例如,您不能以後添加COUNT(*),但可以使用GROUP BY

總之,GROUP BY可以做任何事情DISTINCT可以,但事實並非如此。我只在DISTINCT中使用非常簡單的代碼,因此我可以在一行上得到shole查詢。即使這樣,隨着代碼的發展,我經常會後悔一點,我需要回到GROUP BY

+0

非常感謝,第二個內部連接是我在這種情況下將要使用的方式 –

2
select o.order_id from orders o inner join orders_items oi on o.order_id = oi.item_id inner join items i on oi.item_id = i.id where i.vendor='3'; 

很多方法可以做到同樣的喜歡連接,子查詢,條款。取決於需要像最適合使用的時間或條件的內存條也主要依賴於表的INDEX列和數據連接表的數量。

0

你不需要GROUP BY,只是做一個DISTINCT如果您需要刪除重複:

SELECT DISTINCT o.order_id 
FROM orders o 
INNER JOIN orders_items oi ON oi.order_id = o.order_id 
INNER JOIN items i ON i.id = oi.items_id 
where i.vendor = '3' 

,並且還有所有表:)使用INNER JOIN

0

這是有效的,將工作太::

SELECT 
    DISTINCT(orders.order_id) 
FROM 
    items 

INNER JOIN orders_items on (items.id=orders_items.item_id) 
inner join orders on (orders.order_id=order_items.order_id) 
WHERE 
items.vendor = '3' 
0
SELECT 
    orders.order_id 
FROM 
    orders o 
     INNER JOIN orders_items oi ON o.order_id = oi.order_id 
     INNER JOIN items i ON oi.item_id = i.item_id 
WHERE 
    i.vendor = 3 

的表1,表2語法不是東西,我曾經使用過,但我想列出表作爲聯接是,這似乎是最接受的方式更有效。

此外,如果該字段是整數,則不需要在供應商標準中添加語音標記。

0
SELECT O.order_id AS Id 
FROM orders O 
INNER JOIN orders_items OI 
    ON O.order_id = OI.order_id 
INNER JOIN items I 
    ON OI.item_id = I.id 
WHERE I.vendor = '3' 
GROUP BY O.order_id 
+0

這不是真正。優化器還將WHERE子句放入連接中,它的行爲就像內連接一樣。這只是不同的語法。 *(我不喜歡的語法,但不是在本例中本質上表現出來的語法。)* – MatBailie

+0

@Dems注意到並刪除。 –