mysql - 为什么 count(distinct ..) 在同一张表上返回不同的值?

标签 mysql sql

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/

相关文章:

mysql - 在 Node.js 中管理数据库连接,最佳实践?

mysql - 直接从 iPad 应用程序连接到 MySQL(不通过 PHP 等)

php - Google map 商店定位器 - SQL 语句的 PHP/MySQL 错误

mysql - 选择时间戳在彼此的某个时间范围内的记录

MySQL 从同一个表中选择并更新多行

PHP + MySQL : dynamic table name from first query for execution of second query

mysql - 估计 MySQL "SELECT WHERE EXISTS"查询的结果数?

mysql - 规范化联结表中的列

mysql - 如何将一个表中的信息插入到另一个表中

SQL COUNT 一个值出现了多少次