2014-07-18 38 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)