基于MySQL构建Grafana时序数据的查询方案求助
Grafana 对接 MySQL 构建时序数据的正确查询语句
问题背景
将MySQL数据库作为数据源接入Grafana,需基于现有表构建时序数据,原查询触发MySQL 1055错误,核心需求是编写符合规范的正确查询语句。
原错误查询:
SELECT $__timeGroupAlias(date,1h,0), COUNT(distinct(id)) AS id, 'result' as metric FROM db.table WHERE $__timeFilter(date) AND result = 'pass' GROUP BY DATE_FORMAT(date, '%Y-%m-%d %H:00:00');
错误核心原因
MySQL默认开启ONLY_FULL_GROUP_BY模式,要求SELECT列表中所有非聚合函数的字段必须出现在GROUP BY子句中。原语句中$__timeGroupAlias生成的时间列、'result' as metric均未加入GROUP BY,同时手动写DATE_FORMAT分组和Grafana时间宏逻辑重复,导致冲突。
正确查询写法
写法一:利用列序号+常量分组
SELECT $__timeGroupAlias(date, 1h, 0), COUNT(DISTINCT(id)) AS pass_count, 'pass_result' AS metric FROM db.table WHERE $__timeFilter(date) AND result = 'pass' GROUP BY 1, metric;
GROUP BY 1指代SELECT列表的第一列(即Grafana宏生成的时间分组列)metric是常量值,加入GROUP BY符合MySQL模式要求,不会改变分组逻辑- 将别名
id改为pass_count,避免与原表id字段混淆,语义更清晰
写法二:直接使用Grafana时间宏分组
SELECT $__time(date) AS time, COUNT(DISTINCT(id)) AS pass_count, 'pass_result' AS metric FROM db.table WHERE $__timeFilter(date) AND result = 'pass' GROUP BY $__timeGroup(date, 1h, 0), metric;
$__timeGroup宏会自动生成与时间过滤匹配的分组逻辑,替代手动写DATE_FORMAT- 同样将
metric加入GROUP BY,满足MySQL的模式约束
内容的提问来源于stack exchange,提问作者serverstackqns
相关产品推荐
相关产品推荐

