2014-10-31 99 views
0

为什么以下查询在空数据库的MySQL 5.6中返回NO RESULT?COUNT(*)不能与群组一起使用?

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结果目的是什么?

+0

没有意义只通过ip过滤一个ip和group。 – 2014-10-31 09:41:07

+0

空表,没有结果,在我看来应该如何工作?有0条记录属于你的'HAVING'条款('max(date_created)<= '10 -10-2014'或count(*)> 3') – Wrikken 2014-10-31 09:41:12

+1

提供一些输入数据。 – SonalPM 2014-10-31 09:41:48

回答

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)将是NULLcount(*)将是0,所以这两个条件都会失败。

顺便说一下,您应该使用ISO标准日期格式。因此,having条款应改为:

HAVING max(date_created) <= '2014-10-10' or count(*) > 3; 

当表实际上确实有数据这将帮助。

编辑: 这是计数()的范围问题。当使用聚合数据集时,(GROUP BY ..),聚合内的计数 - 在你的情况下没有聚合,所以没有计数结果。当在简单的select..where上使用count()时,它会计算整个查询的结果,因此即使是空结果集也会被计为0

+0

添加评论cypherabe,关闭它,并添加+1 – kulatamicuda 2014-10-31 15:36:17

0

虽然查询的最后一部分没有意义,这将解决您的问题:

  1. 当创建该表,有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; 
    
  2. 在您的查询,使用数据库日期时间像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; 
    
+0

这并没有解决问题。查询返回不是0,但没有结果。 – kulatamicuda 2014-10-31 10:15:35

+0

我测试了数据并且它工作。给我看你的样本数据 – 2014-10-31 10:16:34

+0

你的样本数据应该有'not-exist-ip'来返回结果 – 2014-10-31 10:17:38

相关问题