MySQL HAVING / WHERE查询。按天分组

问题描述 投票:0回答:1

我有一个名为“ 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

不兼容

我该如何解决这个问题?

我有一个名为“ counter”的表,该表具有3个字段:领域类型空|关键默认值|额外| + -------- + ------------ + ------ + ----- + --------- + ---- ------------ + | id | int(11)...

mysql sql
1个回答
0
投票

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


0
投票

如果您只想获取当前日期第9小时的数据,则实际上并不需要考虑整天的数据,然后进行汇总并使用Haves子句进行筛选。由于增加了数据树查找以及增加了临时表的大小(最终将其丢弃),因此不必要地降低了效率。

© www.soinside.com 2019 - 2024. All rights reserved.