与DISTINCT不一致的COUNT

时间:2011-08-05 12:27:26

标签: mysql

我已经按字段daynumber对表进行了分区。在白天,我写入此表日志,然后计算一些统计数据。桌很大;每天我都有~3M新行。字段myField已编入索引。

此查询

SELECT COUNT(DISTINCT myField) FROM mytable WHERE daynumber=somevalue; 

返回0,这是一个错误。

此查询

SELECT COUNT(*) FROM (SELECT DISTINCT(myField) FROM mytable WHERE daynumber=somevalue) t;

返回正确的值。

对于某些daynumber值,第一个查询可以正常工作。我试图重复该分区,但没有效果。有什么建议吗?


更新

表方案看起来像

CREATE TABLE `mytable` (
  `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `daynumber` INT(10) UNSIGNED NOT NULL,
  `myField` VARCHAR(1024) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
    ... other fields
  PRIMARY KEY (`daynumber`,`id`),
  KEY `myField` (`myField`(20))
) ENGINE=MYISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC
PARTITION BY LIST (daynumber)
(PARTITION day_810 VALUES IN (810) ENGINE = MyISAM,
 PARTITION day_811 VALUES IN (811) ENGINE = MyISAM,
 PARTITION day_812 VALUES IN (812) ENGINE = MyISAM
....)

2 个答案:

答案 0 :(得分:4)

这是因为您的myfield包含NULL

SELECT COUNT(DISTINCT coalesce(myField, '') )
FROM mytable WHERE daynumber=somevalue; 

coalesce有点NULL转换为''
可能不是你要求的,但会返回正确的计数(仍然)

答案 1 :(得分:2)

让我们说'

  • 您为daynumber = somevalue
  • 匹配4行
  • 这3行的MyField为1, 2, 2, NULL

因此,使用子查询有两个步骤。

  • SELECT DISTINCT(myField)提供3行:1, 2, NULL
  • SELECT COUNT(*)这给了3.

没有子查询,一步

  • SELECT COUNT(DISTINCT(myField))仅计算1, 2 = 2

原因:

  • COUNT(*)包含NULL
  • COUNT(anythingelse)不计算NULL

查询不能不一致,因为它们是不同的查询

我记得最好的讨论是DBA.SE: What is the difference between select count(*) and select count(any_non_null_col)?