2014-07-18 40 views
5

我試圖使用LEFT JOINS找到不同的孤立的menu_item記錄,然後檢查NULL值。在MySQL中使用LEFT JOIN查找孤立記錄

以下查詢返回的結果實際上並不是孤兒。 mitem_id是menu_item表的主鍵和price_info表的外鍵。 pinfo_id是price_info表的主鍵和一個外鍵orderdetails表。

SELECT DISTINCT mi.mitem_id, descr 
FROM menu_item mi 
    LEFT JOIN price_info pi ON pi.menu_item = mi.mitem_id 
    LEFT JOIN orderdetails od ON od.price_info = pi.pinfo_id 
WHERE od.detail_id IS NULL; 

一個返回的記錄看起來像這樣:

+----------+------------------+ 
| mitem_id | descr   | 
+----------+------------------+ 
|  926 | Alameda Pale Ale | 
+----------+------------------+ 

我怎麼知道這不是一個孤立的,因爲當我運行查詢:

SELECT od.detail_id 
FROM orderdetails od 
    INNER JOIN price_info pi ON pi.pinfo_id = od.price_info 
    INNER JOIN menu_item mi ON mi.mitem_id = pi.menu_item 
WHERE mi.mitem_id = 926; 

它返回一組記錄:

+-----------+ 
| detail_id | 
+-----------+ 
| 142830 | 
| 142876 | 
| 143394 | 
| 143610 | 

爲什麼它返回的結果不是孤兒?

+0

LEFT JOIN返回「左」表中的所有條目,這些條目可能會或可能不一定在「右」表中。它仍然會返回「右」表中的記錄,因爲它們也位於「左」表中。 –

+0

如果您正在使用OUTER JOIN,則連接的順序與結果相關。你的查詢是非常不同的。您應該爲其他表格添加最少的樣本數據。 – VMai

+2

連接是否可能導致至少一行來自orderdetails,其中detail_id爲NULL?也就是說,可能有多個來自orderdetails的匹配menu_item和price_info的行,並且至少有一個不是NULL – kane

回答

1

凱恩是正確的,記錄被返回非空。 menu_item和price_info之間的多對多關係阻止了我使用LEFT JOIN WHERE NULL來查找孤立的記錄。我最終不得不將我的查詢更改爲:

SELECT DISTINCT mi.mitem_id, descr FROM menu_item mi 
WHERE mi.mitem_id NOT IN 
(SELECT mi.mitem_id FROM menu_item mi 
INNER JOIN price_info pi ON pi.menu_item = mi.mitem_id 
INNER JOIN orderdetails od ON od.price_info = pi.pinfo_id)