【问题标题】:SET a variable in SELECT statement - MySQL在 SELECT 语句中设置变量 - 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 解决方案需要一些有趣的技巧(通常只是增加一个计数器)。

标签: mysql variables concatenation variable-assignment


【解决方案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】:

问题是你不能在一个语句中混合selectset,肯定会出现语法错误:

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 以确保您了解复杂的机制。

【讨论】:

  • "...您永远不应该为用户变量赋值并在同一语句中读取该值..." 这为我节省了大量的试验和-错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-19
  • 2011-03-24
  • 2015-01-27
  • 1970-01-01
  • 2020-11-28
  • 2012-06-29
  • 1970-01-01
相关资源
最近更新 更多