【问题标题】:Finding orphaned records in MySQL using LEFT JOIN使用 LEFT JOIN 在 MySQL 中查找孤立记录
【发布时间】:2014-07-18 23:15:05
【问题描述】:

我正在尝试使用 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 |

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

【问题讨论】:

  • LEFT JOIN 返回“左”表中的所有条目,可能或不一定在“右”表中。它仍然会返回“右”表中的记录,因为它们也在“左”表中。
  • 如果您使用的是外部联接,那么联接的顺序与结果相关。您的查询非常不同。您应该为其他表添加最少的样本数据。
  • 连接是否有可能从 orderdetails 中产生至少一行,其中 detail_id 为 NULL?也就是说,orderdetails中可能有多行匹配menu_item和price_info,并且至少有一个不为NULL

标签: mysql orphan


【解决方案1】:

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)

【讨论】:

    猜你喜欢
    • 2016-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多