2008-10-28 114 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;