在 SELECT 语句中设置变量 - MySQL
Posted
技术标签:
【中文标题】在 SELECT 语句中设置变量 - MySQL【英文标题】:SET a variable in SELECT statement - MySQL 【发布时间】:2013-03-12 22:32:13 【问题描述】:我正在使用这个有错误的代码:
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)
);
导致问题的原因是什么?
【问题讨论】:
可能是by_ids INT('10','11')
到by_ids IN('10','11')
?
为什么 AND SET @rejects = CONCAT(@rejects,',',src)
在 WHERE
子句中?
这就是我想要的,我想将每个搜索到的 src 的值连接到 @rejects 变量中。
||不应用作或。
您可以在搜索“mysql group by best/top n”或类似内容时看到示例 - 这是因为 MySQL 解决方案需要一些有趣的技巧(通常只是增加一个计数器)。
【参考方案1】:
那么你可以这样写你的查询。
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;
【讨论】:
您的预期输出是什么?此外,如果 src 为空,则可能存在问题。你能发布你的表结构和预期的输出吗?【参考方案2】:问题是你不能在一个语句中混合select
和set
,肯定会出现语法错误:
select*from t where 1 and set@a=1;
ERROR 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“set@a=1”附近使用正确的语法
如果您想在select
中执行set
,请使用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 也提到了这一点。
最后,如果您正在做古怪的事情,例如为变量分配不同的值类型等,checkout the manual 以确保您了解复杂的机制。
【讨论】:
"...您永远不应该为用户变量赋值并在同一语句中读取该值..." 这为我节省了大量的试验和-错误。以上是关于在 SELECT 语句中设置变量 - MySQL的主要内容,如果未能解决你的问题,请参考以下文章