【问题标题】:MySQL GROUP BY query group results by dayMySQL GROUP BY 按天查询组结果
【发布时间】:2020-02-06 16:38:42
【问题描述】:

我有一个名为“counter”的表,它有 3 个字段:

| Field  | Type       | Null | Key | Default | Extra          |
+--------+------------+------+-----+---------+----------------+
| id     | int(11)    | NO   | PRI | NULL    | auto_increment |
| record | datetime   | YES  |     | NULL    |                |
| passed | tinyint(1) | YES  |     | NULL    |                |
+--------+------------+------+-----+---------+----------------+

我存储的数据是这样的

mysql> SELECT record, passed FROM counter;
+---------------------+--------+
| record              | passed |
+---------------------+--------+
| 2019-09-19 00:00:00 |      1 |

我想做的是查询特定日期的结果。

我使用了那个查询:

SELECT DATE_FORMAT(record, '%d-%m-%Y %H') AS ts, 
       COUNT(*) AS passed 
FROM counter 
GROUP BY ts 
HAVING ts = 09;

问题是如果数据库中有几个月,它会返回每个月的第 09 天。

+---------------+--------+
| ts            | passed |
+---------------+--------+
| 09-10-2019 10 |    593 |
| 09-10-2019 11 |    667 |
| 09-10-2019 12 |    367 |
| 09-10-2019 13 |     35 |
+---------------+--------+

我想得到一个确切的日期,我试着输入确切的日期

SELECT DATE_FORMAT(record, '%d-%m-%Y %H') AS ts, 
       COUNT(*) AS passed 
FROM counter 
WHERE 09-10-2019;

但我得到一个错误

错误 1140 (42000):在没有 GROUP BY 的聚合查询中,SELECT 列表的表达式 #1 包含非聚合列“iot.counter.record”;这与 sql_mode=only_full_group_by 不兼容

我该如何解决这个问题?

【问题讨论】:

  • 标题与您发布的代码不一致。您想按天分组还是按天 + 小时分组?

标签: mysql sql group-by aggregate-functions


【解决方案1】:

问题是您在日期格式中包含了小时,这意味着每天最多有 24 个子组……一天中的每个小时一个。删除%H 并修复WHERE 子句:

SELECT DATE_FORMAT(record, '%d-%m-%Y') AS ts, COUNT(*)
FROM counter
WHERE record >= '2019-10-09'
AND   record <  '2019-10-09' + INTERVAL 1 DAY
GROUP BY DATE_FORMAT(record, '%d-%m-%Y')

【讨论】:

    【解决方案2】:

    如果您只想获取当前日期第 9 小时的数据,您实际上不需要考虑一整天的数据,然后使用 having 子句进行聚合和过滤。由于增加了数据树查找以及增加了临时表大小(最终会被丢弃),这不必要地低效。

    相反,您可以只使用WHERE 子句过滤掉数据并计数:

    SELECT COUNT(*) 
    FROM counter
    WHERE record >= '2019-10-09 09:00:00' 
      AND record <  '2019-10-09 10:00:00'
    

    以上查询将显着受益于 (record) 列上的覆盖索引。

    【讨论】:

      猜你喜欢
      • 2014-04-28
      • 2011-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多