我使用的代码有错误:
SET @rejects = '';
SELECT *
FROM list
WHERE maker = 1
AND by_ids IN ('10','11')
AND country LIKE '%I%'
AND (
src IS NULL
|| src NOT IN (@rejects)
AND checkSrc(src) = 'yes'
AND SET @rejects = CONCAT(@rejects,',',src)
);
是什么导致了这个问题?
答案 0 :(得分:7)
问题是你不能在一个语句中混合使用select
和set
,肯定会出现语法错误:
select*from t where 1 and set@a=1;
错误1064(42000):您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在第1行的“set @ a = 1”附近使用正确的语法
如果您想在set
内执行select
,请使用the colon equals语法。改变这个:
select*from t where 1 and set@a=1;
成:
select*,@a:=1 from t where 1;
以下是更新每个行的变量的方法:
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 | +-----------------------+
或concat
没有前导0
:
set@a='';
select @a:=concat(@a,if(@a='','',','),id)from t;
+------------------------------------+ | @a:=concat(@a,if(@a='','',','),id) | +------------------------------------+ | 1 | | 1,2 | | 1,2,3 | +------------------------------------+
...你应该从不为用户变量赋值并阅读 同一声明中的价值...
...你可能得到你期望的结果,但这没有 保证即可。
...涉及用户变量的表达式的评估顺序是 的未定义强>
这也被提及on Xaprb。
最后,如果你正在做 quirky 之类的事情,例如为变量等分配不同的值类型,checkout the manual以确保你理解错综复杂的机制。
答案 1 :(得分:2)
然后你可以写这样的查询。
SET @rejects = '';
SELECT @rejects = CONCAT(@rejects,',',src) FROM list WHERE maker = 1 AND by_ids IN ('10','11') AND country LIKE '%I%' AND
(src IS NULL OR src NOT IN (@rejects) AND checkSrc(src) = 'yes');
SELECT @rejects;