为什么以下查询在空数据库中的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(*)将返回一个数字&gt; 0,如果没有则为0,如果查询错误则异常。但永远不会为NULL - COUNT ???
上的NULL / NO结果是什么答案 0 :(得分:3)
这是查询:
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;
当表格确实有数据时,这将有所帮助。
EDITED: 这是count()的范围,计算的内容。使用聚合数据集(GROUP BY ..)时,聚合中的计数计数 - 在您的情况下没有聚合,因此没有计数结果。在简单的select..where ..上使用count()时,它会计算整个查询的结果,因此即使空结果集也会被计为0
答案 1 :(得分:0)
虽然查询的最后一部分没有意义,但这可以解决您的问题:
创建此表时,请将ip默认设置为not-exist-ip
,如下所示:
CREATE TABLE a_sec_banns (
ID bigint(20) NOT NULL AUTO_INCREMENT,
DATE_CREATED datetime DEFAULT NULL,
IP varchar(60) NOT NULL DEFAULT NULL 'not-exist-ip',
PRIMARY KEY (ID)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
在您的查询中,使用数据库日期时间进行比较,例如:2014-10-10 00:00:00
,如下所示:
SELECT COUNT(*)
FROM a_sec_banns
WHERE ip = 'not-exist-ip'
GROUP BY ip
HAVING max(date_created) <= '2014-10-10 00:00:00' or count(*) > 3;