问题在于您不能在一个语句中同时使用
select
和
set
,否则一定会出现语法错误。
select*from t where 1 and set@a=1;
如果您想在
select
中使用
set
,请使用
冒号等于语法。更改如下:
错误1064(42000):您的SQL语法有误;请检查与您的MySQL服务器版本相对应的手册,以获取正确的语法使用方式,在“set@a=1”附近的第1行
select*from t where 1 and set@a=1;
转换成:
select*,@a:=1 from t where 1;
这是如何在每行更新变量的:
upon each 表示“每次”:
create table t(id int); insert t values(1),(2),(3);
set@a=0;
select@a:=id from t;
+
| @a:=id |
+
| 1 |
| 2 |
| 3 |
+
而且你甚至可以执行concat
操作:
set@a='0';
select @a:=concat(@a,',',id)from t;
+
| @a:=concat(@a,',',id) |
+
| 0,1 |
| 0,1,2 |
| 0,1,2,3 |
+
或者没有前导0的
concat
:
set@a='';
select @a:=concat(@a,if(@a='','',','),id)from t;
+
| @a:=concat(@a,if(@a='','',','),id) |
+
| 1 |
| 1,2 |
| 1,2,3 |
+
然而,该手册明确指出这是危险的:![link](https://istack.dev59.com/hF2GB.webp)
...您永远不应将值分配给用户变量并在同一语句中读取该值...
...您可能会得到期望的结果,但不能保证。
...涉及用户变量的表达式计算顺序未定义。
这也曾在Xaprb上提到过。
最后,如果您正在做一些奇怪的事情,如将不同类型的值分配给变量等,请查看手册以确保您了解复杂的机制。
WHERE
子句中使用AND SET @rejects = CONCAT(@rejects,',',src)
? - Ravindra Gullapalli