MySQL故障?NOT IN和LEFT JOIN返回不同的结果
我们有两张桌子。表“列表”有1114行。表“公司””有1094行。这些表有1082条公共线。当我查找表之间不常见的行时,LEFT JOIN返回正确的结果,但not IN不返回 相关列中绝对没有空值。LEFT JOIN返回的值(如前所述不为空)只属于一个表,而不属于预期的另一个表 表是InnoDB,相关列都是MySQL故障?NOT IN和LEFT JOIN返回不同的结果,mysql,Mysql,我们有两张桌子。表“列表”有1114行。表“公司””有1094行。这些表有1082条公共线。当我查找表之间不常见的行时,LEFT JOIN返回正确的结果,但not IN不返回 相关列中绝对没有空值。LEFT JOIN返回的值(如前所述不为空)只属于一个表,而不属于预期的另一个表 表是InnoDB,相关列都是varchar(255),并且每个列都有一个索引 有人能解释一下这种奇怪的行为吗 以下是查询及其结果: 正确的结果: SELECT COUNT(*) FROM list l LEFT JO
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
)
意外结果:
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
)
看起来你有重复的 如果列表类似于:
A,B,C,A
和公司:
A,B,C,D,E,A
然后,公司列表的左键将给出6个结果
但是,A不在将根据您的操作方式给出3或0。谢谢您的回复。我们删除了一个这样的案例,但问题仍然存在。
Full_Company_Name
上的键是唯一的还是正常的?它们是正常的,但我们通过运行SELECT Full_Company_Name,count(*)c FROM list group by Full_Company_Name,by c>1来确定这些值确实是唯一的;然后选择完整的公司名称,按c>1的完整公司名称从公司组中计算(*)c,两者都返回0结果。检查数据类型的字符集和排序规则(区分大小写,utf8与拉丁语)。可能涉及到一些自动广播。另外,请尝试选择*
并查看值(例如,如果它们有特殊字符),然后直接在不在查询中尝试这些值(例如不在(选择“堆栈交换公司”)
这似乎是我们的问题。我们删除了一些带有希腊文和特殊字符的记录后,问题就解决了。我们将研究我们的字符集和排序规则。谢谢Solarfare!谢谢。如上所述,我们没有重复的。您能提供一个显示相同问题的简化数据集吗?