【问题标题】:MySQL COUNT(DISTINCT()) unexpected resultsMySQL COUNT(DISTINCT()) 意外结果
【发布时间】:2010-09-19 15:24:29
【问题描述】:

我在 CentOS 5.1 上使用 MySQL 5.0.45。

SELECT DISTINCT(email) FROM newsletter

返回 217259 行

SELECT COUNT(DISTINCT(email)) FROM newsletter

返回 180698 作为计数。

SELECT COUNT(*) FROM (SELECT DISTINCT(email) FROM newsletter) AS foo

返回 180698 作为计数。

不应该所有 3 个查询都返回相同的值吗?

这是时事通讯表的架构

CREATE TABLE `newsletter` ( `newsID` int(11) NOT NULL auto_increment, `email` varchar(128) NOT NULL default '', `newsletter` varchar(8) NOT NULL default '', 主键(`newsID`) ) 引擎=MyISAM;

更新:我发现如果我在第一个查询中添加WHERE 子句,那么我会得到正确的结果。 WHERE 子句不会影响结果。

SELECT DISTINCT(email) FROM newsletter WHERE newsID > 0

【问题讨论】:

  • 我也有同样的问题,count(DISTINCT s0_.id)返回31结果,但是DISTINCT s0_.id返回26结果,而结果中没有任何重复的id

标签: sql mysql


【解决方案1】:

您能否将不同的结果相交以查看额外的行是什么?

【讨论】:

  • 不同的结果之一是聚合,他怎么能这样做?
【解决方案2】:

我的猜测是电子邮件列中有一些空值。试试

select count(*) from newsletter where email is null;

【讨论】:

  • 此外,最多应该导致1的差异。
  • 也寻找空字符串值,许多新手开发者用来避免NOT NULL子句$string = ''
【解决方案3】:

在第一种情况下,如果将其更改为“select distinct(email) from newsletter order by email;”会发生什么我不认为它应该有所作为,但它可能会。

【讨论】:

    【解决方案4】:

    是的,作为 Maglob said,您的电子邮件列中可能会出现一些 NULL。尝试类似:

    SELECT COUNT(COALESCE(email, 0)) FROM newsletter
    

    这会给您带来您期望的结果。等一下。定义说电子邮件不接受 NULL 值。如果真是这样,那就太奇怪了。

    【讨论】:

      【解决方案5】:

      一种可能的解释是,在您的两个查询之间从表中删除了行。但我假设你已经以不同的顺序多次运行了这些,所以我怀疑就是这样。

      你从这个查询中得到多少行数:

      SELECT email FROM newsletter GROUP BY email;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-17
        • 2016-04-04
        • 2015-01-28
        • 1970-01-01
        • 2015-09-03
        • 2018-12-17
        相关资源
        最近更新 更多