当变量中存储单个值时,以下工作正常。
SET @a := "20100630";
SELECT * FROM wordbase WHERE verified = @a;
但是当变量中存储了多个值时,它不起作用。
SET @a := "'20100630', '20100701' ";
SELECT * FROM wordbase WHERE verified in (@a);
我是否需要为此使用准备好的声明?
答案 0 :(得分:14)
这里描述了一个很好的解决方案:https://stackoverflow.com/a/11957706/1523961
所以可以使用这样的东西:
SET @a := '20100630,20100701';
SELECT * FROM wordbase WHERE FIND_IN_SET(verified, @a);
此外,如果您从另一个表格中选择@a
的ID,则可以提供以下信息:
SET @a := (SELECT GROUP_CONCAT(id) FROM someTable where yourBooleanExpressionHere);
SELECT * FROM wordbase WHERE FIND_IN_SET(verified, @a);
答案 1 :(得分:5)
你不能(据我所知)在MySQL用户定义的变量中存储多个值。你所做的是创建一个包含以下内容的字符串:
'20100630', '20100701'
这不是两个单独的值,而是一个字符串值,就像这是一个字符串值:
SET @a := "It's a single string, and that's the problem";
您需要使用两个单独的变量,或者准备一个语句,如下所示:
SET @a := "20100630";
SET @b := "20100701";
SET @sql = CONCAT(
'SELECT * FROM wordbase WHERE verified IN (',
@a,
',',
@b,
')'
);
SELECT @sql;
+--------------------------------------------------------------+
| @sql |
+--------------------------------------------------------------+
| SELECT * FROM wordbase WHERE verified IN (20100630,20100701) |
+--------------------------------------------------------------+
PREPARE stmt FROM @sql;
EXECUTE stmt;
但那有点凌乱。为什么需要使用变量?
答案 2 :(得分:4)
使用GROUP_CONCAT
和GROUP BY
可以将所有值(即id)拉入变量,如下所示:
SET @var := (SELECT GROUP_CONCAT(id) FROM `table` WHERE `verified` = @verified GROUP BY verified);
答案 3 :(得分:2)
这样的事情应该有效。是否可以使用预准备语句来创建这样的临时表?
SET @a := "'20100630', '20100701'";
SET @sql = CONCAT('create temporary table pn1 SELECT * FROM wordbase WHERE verified IN (', @a, ')');
PREPARE stmt FROM @sql;
EXECUTE stmt;
select * from pn1;
答案 4 :(得分:0)
SELECT GROUP_CONCAT(field_table1 SEPARATOR ',') FROM table1 into @var;
然后
SELECT * FROM table2 WHERE field_table2 in(@var);
对我来说很好用
答案 5 :(得分:0)
FIND_IN_SET(要在列中找到的列,字符串csv)是非常方便的方法,以防您拥有CSV的字符串列表:
SET @a := "'20100630', '20100701' ";
SELECT * FROM wordbase WHERE FIND_IN_SET(verified, @a);
如果您的变量也来自查询,请使用它来设置@a
SET @a := (SELECT GROUP_CONCAT(`id`) FROM `table`);
答案 6 :(得分:0)
如果您需要将变量用于选择或删除,您可以在选择中使用选择:
delete from MPCurrentPayEntitlementAccrual where CurrentPayEntitlementID in ( select CurrentPayEntitlementID from MPCurrentPayEntitlement where PayRunID=myPayRunId by PayRunID desc);
这对我来说非常有效