MySQL聚合查询添加WHERE子句触发#1292错误的解决求助
问题排查与解决方案
错误原因分析
你遇到的#1292 Truncated wrong DOUBLE value: 'user'错误,根源有两个:
- 你在
WHERE子句里写了'user' = 1,这里的单引号把user变成了字符串常量,MySQL会尝试把字符串'user'转换成数字和1比较,自然会触发类型转换失败的报错。 - 就算去掉单引号写成
user = 1,依然会报错——因为WHERE子句的执行优先级在SELECT之前,此时user这个别名还未被创建,MySQL无法识别它。
正确写法
这里提供两种可行的解决方案,你可以根据数据量和业务需求选择:
方案1:使用HAVING子句筛选分组后的数据
HAVING是在GROUP BY和SELECT之后执行的,可以直接引用SELECT里定义的别名,写法简洁直观:
select `submission_id`, max(case when `key` = 'id_usuario' then value end) as user, max(case when `key` = 'date_atualizado' then value end) as Data, max(case when `key` = 'peso' then value end) as Peso from wp_e_submissions_values group by `submission_id` HAVING user = 1;
方案2:提前筛选原始数据(性能更优)
如果你的表数据量较大,优先考虑在分组前就筛选出目标提交记录,减少分组处理的数据量,提升查询性能:
select `submission_id`, max(case when `key` = 'id_usuario' then value end) as user, max(case when `key` = 'date_atualizado' then value end) as Data, max(case when `key` = 'peso' then value end) as Peso from wp_e_submissions_values where submission_id in ( select submission_id from wp_e_submissions_values where `key` = 'id_usuario' and value = '1' ) group by `submission_id`;
注意:如果
value字段是字符串类型,value = '1'要加单引号;如果是数字类型,直接写value = 1即可,可根据你的表结构调整。
内容的提问来源于stack exchange,提问作者Michael Bouix
相关产品推荐
相关产品推荐

