我有这个列的大MySql表:
id int(10) unsigned Auto Increment
pr_id int(10) unsigned
temp_air varchar(255) NULL
created_at timestamp NULL
updated_at timestamp NULL
我想获取 24 小时前数据的行,并从每小时的此选择数据中获取。
我尝试的查询是:
SELECT *
FROM `statistics`
WHERE DATE(created_at) = CURDATE()- INTERVAL 1 DAY
GROUP BY
EXTRACT(HOUR FROM created_at)
ORDER BY
EXTRACT(HOUR FROM created_at)
并且发生错误:
查询 (1055( 中的错误:SELECT 列表的表达式 #1 不在 GROUP BY 子句中,并且包含非聚合列"statistic.statistics.id" 在功能上不依赖于 GROUP BY 子句中的列; 这与 sql_mode=only_full_group_by 不兼容
我必须如何更改我的查询?我的错误在哪里?
SELECT *
与GROUP BY
不兼容。在5.7.5版本之前,MySQL曾经接受无效的GROUP BY
查询,但它返回了不确定的值。
GROUP BY
查询不会从数据库中返回行;它会动态生成它返回的记录。从根据 GROUP BY
子句生成的每组行中,它生成一行。 SELECT *
对GROUP BY
没有意义;如果一个组包含多行,它应该为id
列返回什么值,例如?
如果您不想每小时生成一行,那么GROUP BY
这不是您所需要的。
但是,如果要每小时生成一行,则查询应如下所示:
SELECT EXTRACT(HOUR FROM created_at), AVG(temp_air) AS temp_air
FROM `statistics`
WHERE created_at >= DATE_SUB(CURTIME(), INTERVAL 1 DAY)
GROUP BY EXTRACT(HOUR FROM created_at)
ORDER BY EXTRACT(HOUR FROM created_at)
原始WHERE
条件(DATE(created_at) = CURDATE()- INTERVAL 1 DAY
(使用的DATE()
函数不允许MySQL使用索引来过滤要处理的行,它需要读取整个表数据。它现在可以使用索引(假设create_at
列上有索引(。