select count(distinct a,b,c,d) from mytable;
select count(distinct concat(a,'-',b),concat(c,'-',d)) from mytable;
因为“-”从未出现在 a、b、c、d 字段中,所以上面的 2 个查询应该返回相同的结果。我对吗 ?
实际上并非如此,差异是 ~60M 中的 4 行,我无法弄清楚这是怎么可能的
任何想法或例子? 谢谢
最佳答案
首先,我假设您使用的是 MySQL,因为这是唯一可以接受您的语法的原始标签数据库。
其次,这并没有直接回答你的问题。鉴于您的类型和表达方式,我看不出您如何获得不同的结果。然而,非常相似的结构可能会产生不同的结果。
请务必注意,NULL
不是罪魁祸首。如果 COUNT(DISTINCT)
或 CONCAT()
的任何参数为 NULL
,则结果为 NULL
- - 和 NULL
不计算在内。
但是,字符串末尾的空格可能是个问题。考虑这个查询的结果:
select count(distinct x, y),
count(distinct concat(x, '-', y)),
count(distinct concat(y, '-', x))
from (select 1 as x, 'a' as y union all
select 1, 'a ' union all
select 1, NULL
) a
我希望第二个和第三个参数返回相同的东西。但是字符串末尾的空格会导致差异。 COUNT(DISTINCT)
忽略它们。但是,CONCAT()
会将它们嵌入到字符串中。因此,上述返回
1 1 2
而且这两个值是不同的。
换句话说,两个值可能不完全相同,但 COUNT(DISTINCT)
可能认为它们相同。空格就是一个例子。排序规则是另一个潜在的罪魁祸首。
关于mysql - 为什么 count(distinct ..) 在同一张表上返回不同的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48582179/