COUNT(*)不与群组合作?

时间:2014-10-31 09:39:28

标签: 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(*)将返回一个数字&gt; 0,如果没有则为0,如果查询错误则异常。但永远不会为NULL - COUNT ???

上的NULL / NO结果是什么

2 个答案:

答案 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)NULLcount(*)为0,因此两种情况都会失败。

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

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

当表格确实有数据时,这将有所帮助。

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

答案 1 :(得分: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;