MySQL COUNT(DISTINCT())意外结果

时间:2008-10-28 17:59:21

标签: sql mysql

我在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 '',
  PRIMARY KEY  (`newsID`)
) ENGINE=MyISAM;

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

SELECT DISTINCT(email) FROM newsletter WHERE newsID > 0

5 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

是的,作为Maglob said,您可能会在电子邮件列中收到一些NULL。尝试使用类似的东西:

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

这会给你你期望的结果。等一下。该定义表明电子邮件不接受NULL值。如果情况确实如此,则很奇怪。

答案 4 :(得分:0)

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

您从此查询中获得了哪些行数:

SELECT email FROM newsletter GROUP BY email;