2013-03-10 107 views
-3

我們有一個名爲productID的表,其中productID爲主鍵。然後我們有一個名爲productProcess的表,其中存儲了productID和processID。所以現在我們要搜索productProcess表中沒有實例的所有productID。目前,我們首先運行兩個查詢所有產品,其次是productProcess的productID,並選擇不存在的產品ID。有沒有其他的機制呢?Mysql查詢效率

+4

我有這張表,我有那張表,但哪裏的查詢必須優化? – 2013-03-10 16:57:50

+2

是的。你有什麼嘗試? – SJuan76 2013-03-10 16:58:29

+1

我首先從tblProduct中選擇productId。然後我嘗試從tblProductProcess中選擇不同的productID。然後我比較兩者並選擇那些productID在第二個查詢中不存在。 – biz14 2013-03-10 17:03:25

回答

2

是的,有。使用LEFT JOIN

SELECT a.*  // this will get all columns from product table. 
FROM product a 
     LEFT JOIN productProcess b 
      ON a.productID = b.productID 
WHERE b.productID IS NULL 

爲了進一步獲得更多的知識有關加入,請訪問以下鏈接:

另一個提示,使若快速呃是爲表productProcess設置一個外鍵productID

+0

是的productID是外鍵,但我不明白爲什麼我們必須把b.productID是NULL? – biz14 2013-03-10 17:07:40

+0

哦,我明白了,請記住,我們正在使用'LEFT JOIN',它將返回左側表中的所有記錄。第二個表上沒有匹配ID的記錄在其他列上的值爲null。爲了演示:[>> CLICK_HERE <<](http://www.sqlfiddle.com/#!2/8b410/3) – 2013-03-10 17:10:24

+1

好吧我現在清楚了。 – biz14 2013-03-10 17:11:33

2

假設product.productID 不能爲空

SELECT product.productID 
FROM product 
LEFT JOIN productProcess 
ON productProcess.productID = product.productID 
WHERE productProcess.productID IS NULL 

另一種選擇是WHERE NOT EXIST

SELECT product.productID 
FROM product 
WHERE NOT EXISTS (
    SELECT productID FROM productProcess 
    WHERE productProcess.productID = product.productId 
) 
+0

這是更快的產生結果? – biz14 2013-03-10 17:06:14

+0

測試一下,這會告訴你。這兩者在這裏的工作大致相同,但它在不同的mysql服務器版本中會有一些偏差。 – Wrikken 2013-03-10 17:07:26

+0

好吧我會測試它,但我認爲你必須交換這個ON productProcess.productID = product.productID – biz14 2013-03-10 17:12:18

1

您可以使用左連接。 如果您可以使用左連接,則結果將是所有與產品和產品流程有關的產品。

SELECT p.* 
FROM (product p LEFT JOIN productProcess pp ON a.productID = b.productID) 
WHERE pp.productID IS NULL