MySQL如何声明变量?SET自定义变量赋值语句报错排查
MySQL变量赋值语句错误排查
你的代码存在两处明确的语法和逻辑错误:
- 语法层面:子查询的闭合括号外多余了
as variabile)片段,SET @变量 = (子查询)的语法结构中,子查询不需要定义别名,多余的别名和重复的右括号会直接触发SQL语法解析失败。 - 逻辑层面:
SET给单个用户变量赋值时,括号内的子查询必须是标量子查询,也就是只能返回单行单列的单个值。但你写的子查询返回了4个字段,且按submit_time分组后会返回多行结果,完全不符合单个变量的赋值要求,就算删掉多余语法片段也无法正常执行。
根据你的实际需求,可以选择对应正确写法:
方案1:需要临时存储整个多列多行的查询结果后续复用
单个@用户变量无法存储结果集,应该使用临时表实现:
-- 创建临时表存储查询结果 CREATE TEMPORARY TABLE temp_submit_data SELECT `submit_time` AS 'Submitted', MAX(IF(`field_name`='N_PROGRESSIVO', `field_value`, NULL)) AS 'N_PROGRESSIVO', MAX(IF(`field_name`='Submitted From', `field_value`, NULL)) AS 'Submitted From', GROUP_CONCAT(IF(`file` IS NULL OR LENGTH(`file`) = 0, NULL, `field_name`)) AS 'fields_with_file' FROM `wpcust_cf7dbplugin_submits` WHERE `form_name` = 'Modulo SDO 2022 BS' GROUP BY `submit_time` ORDER BY `submit_time` DESC; -- 后续使用时直接查询临时表即可 SELECT * FROM temp_submit_data;
临时表仅在当前数据库连接会话内生效,连接断开后会自动清理,不会修改原表的任何数据。
方案2:只需要把查询结果中某一个单行单列的值存入变量
调整子查询仅返回目标字段,增加LIMIT 1确保仅返回一行结果即可,示例(存储最新一条记录的N_PROGRESSIVO字段值):
SET @variabile = ( SELECT MAX(IF(`field_name`='N_PROGRESSIVO', `field_value`, NULL)) FROM `wpcust_cf7dbplugin_submits` WHERE `form_name` = 'Modulo SDO 2022 BS' GROUP BY `submit_time` ORDER BY `submit_time` DESC LIMIT 1 );
内容的提问来源于stack exchange,提问作者foscolino
相关产品推荐
相关产品推荐

