2008-10-28 119 views
2

我在CentOS 5.1上使用MySQL 5.0.45。MySQL COUNT(DISTINCT())意外结果

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

+0

良好的自我回答的问题! – dkretz 2008-11-10 18:54:56

回答

2

可能你可能相交的不同结果中看到更多行是什么?

+0

mysql是否支持MINUS? – 2008-10-28 18:26:04

+0

其中一个不同的结果是聚合,他怎么能做到这一点? – 2008-10-28 19:27:39

0

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

2

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

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

是的,Maglob said你可能会得到一些空值在您的电子邮件列。试试类似的:

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

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

0

一个可能的解释是,在您的两个查询之间的行从表中删除。但我认为你已经多次以各种顺序运行这些东西,所以我怀疑这就是它。

你从此查询得到什么行数:

SELECT email FROM newsletter GROUP BY email;