Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL故障?NOT IN和LEFT JOIN返回不同的结果_Mysql - Fatal编程技术网

MySQL故障?NOT IN和LEFT JOIN返回不同的结果

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

我们有两张桌子。表“列表”有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
)
意外结果:

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!谢谢。如上所述,我们没有重复的。您能提供一个显示相同问题的简化数据集吗?