mysql - COUNT(*) 不与 group by 一起工作?

标签 mysql sql

为什么以下查询在空数据库的 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) 将为 NULLcount(*) 将为 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/

相关文章:

java - 无法在带有 MySql 的 JPA 实体中使用 java.time.LocalDate

php - 使用 jQuery (Ajax) 和 PHP 仅从 MySQL 获取最新消息? (实时聊天应用程序)

mysql - 检查表中已有值的问题

java - sql结果集无法返回结果集是什么原因?

python - 使用 sqlite 在 python 中使用 cursor.execute 和 cursor.fetchall 的问题

sql - 如何优化两次具有相同子查询的查询?

mysql - 由于错误 150(外键约束),删除后无法重新创建 mysql 表!

mysql - SQL Server - 返回 null 的 SELECT 语句

php日期时间插入到mysql

SQL Where 子句带有 If(或 Case)语句?