为什么以下查询在空数据库的 MySQL 5.6 中返回 NO RESULT?
SELECT COUNT(*)
FROM a_sec_banns
WHERE ip = 'not-exist-ip'
GROUP BY ip
HAVING max(date_created) <= '10-10-2014' or count(*) > 3;
表的结构是这样的:
CREATE TABLE `a_sec_banns` (
`ID` bigint(20) NOT NULL AUTO_INCREMENT,
`DATE_CREATED` datetime DEFAULT NULL,
`IP` varchar(60) NOT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
我希望查询 COUNT(*) 将返回一个数字 > 0,如果没有返回 0,如果查询错误则异常。但绝不为 NULL - COUNT 的 NULL/NO 结果目的是什么???
最佳答案
这是查询:
SELECT COUNT(*)
FROM a_sec_banns
WHERE ip = 'not-exist-ip'
GROUP BY ip
HAVING max(date_created) <= '10-10-2014' or count(*) > 3;
如果您只在空数据库上运行第一部分:
SELECT COUNT(*)
FROM a_sec_banns
WHERE ip = 'not-exist-ip'
GROUP BY ip ;
您将获得值为 0
的一行。
但是,having
子句会过滤掉这一行。 max(date_created)
将为 NULL
而 count(*)
将为 0,因此这两个条件都会失败。
顺便说一句,您应该使用 ISO 标准日期格式。因此,having
子句应为:
HAVING max(date_created) <= '2014-10-10' or count(*) > 3;
当表确实有数据时,这会有所帮助。
编辑: 这是 count() 范围的问题,是计算什么的问题。使用聚合数据集(GROUP BY ..)时,计算聚合内的计数 - 在您的情况下没有聚合,因此没有计数结果。在简单的 select..where.. 上使用 count() 时,它会计算整个查询的结果,因此即使是空结果集也会被计为 0
关于mysql - COUNT(*) 不与 group by 一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26671483/