mysql变量中的多个值

时间:2010-07-01 09:21:05

标签: mysql

当变量中存储单个值时,以下工作正常。

SET @a := "20100630";
SELECT * FROM wordbase WHERE verified = @a;

但是当变量中存储了多个值时,它不起作用。

SET @a := "'20100630', '20100701' ";
SELECT * FROM wordbase WHERE verified in (@a);

我是否需要为此使用准备好的声明?

7 个答案:

答案 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_CONCATGROUP 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);

这对我来说非常有效