使用LEFT JOIN在MySQL中查找孤立记录

时间:2014-07-18 23:15:05

标签: mysql orphan

我试图使用LEFT JOINS找到不同的孤立的menu_item记录,然后检查NULL值。

以下查询返回的结果实际上并非孤儿。 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 |

为什么它返回的结果不是孤儿?

1 个答案:

答案 0 :(得分:2)

Kane是正确的,因为返回的记录不是空的。 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)