首页 > 解决方案 > MySQL故障?NOT IN 和 LEFT JOIN 返回不同的结果

问题描述

我们有 2 张桌子。表“列表”有1114行。表“公司”有 1094 行。这些表有 1082 条公共线。当我查找表之间不常见的行时,LEFT JOIN返回正确的结果,但 NOT IN 没有。

相关列中绝对没有空值。LEFT JOIN返回的值(如前所述不为空)只属于一个表,但不属于另一个表,正如人们所期望的那样。

这些表是InnoDB,相关列都是,varchar(255)并且每个都有一个索引。

有人可以帮助解释这种奇怪的行为吗?

以下是查询及其结果:

正确结果:

SELECT COUNT(*) 
FROM list l 
LEFT JOIN companies c 
ON l.Full_Company_Name = c.Full_Company_Name 
WHERE c.Full_Company_Name IS NULL

Array
(
    [COUNT(*)] => 32
)

SELECT COUNT(*) 
FROM  companies c 
LEFT JOIN list l
ON l.Full_Company_Name = c.Full_Company_Name 
WHERE l.Full_Company_Name IS NULL

Array
(
    [COUNT(*)] => 12
)

意想不到的结果:

SELECT COUNT(*) 
FROM  companies c 
WHERE c.Full_Company_Name NOT IN
(SELECT l.Full_Company_Name FROM list l)

Array
(
    [COUNT(*)] => 11
)

SELECT COUNT(*) 
FROM  list l
WHERE l.Full_Company_Name NOT IN
(SELECT c.Full_Company_Name FROM companies c )

Array
(
    [COUNT(*)] => 0
)

标签: mysql

解决方案


看起来你有重复。

如果列表类似于:

A,B,C,A

和公司:

A,B,C,D,E,A

然后,公司列表的左连接会为您提供 6 个结果。

然而,一个 not in 会给你 3 或 0,这取决于你做的方式。


推荐阅读