2010-07-01 46 views
10

當存儲單個值存儲在變量中時,以下方式將按預期工作。mysql變量中的多個值

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

但是,當變量中存儲多個值時,它不起作用。

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

我是否需要爲此使用預處理語句?

+0

SET @a:=「 '20100630' ,'20100701'「應該被設置爲@a:=」20100630,20100701「。你已經爲整數值添加引號,導致它不返回任何行 – Akash 2013-07-21 08:57:06

回答

3

你不能(據我所知)在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

像這樣的東西應該工作。使用預處理語句來創建像這樣的臨時表是否可以?

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; 
+0

我知道這是一箇舊帖子,但是這個工作非常完美,特別是當你有多個值時。 – sho 2011-11-01 06:55:50

3

使用GROUP_CONCATGROUP BY一個可以把所有的值(即一個id)到像這樣的變量:

SET @var := (SELECT GROUP_CONCAT(id) FROM `table` WHERE `verified` = @verified GROUP BY verified); 
+3

取決於值的數量。 GROUP_CONCAT有一個最大長度。 – buggedcom 2015-04-29 12:08:02

8

這裏有描述很好的解決方案:https://stackoverflow.com/a/11957706/1523961

所以可以使用類似這個:

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

另外,如果你是seleclec婷的ID爲@a從另一個表,你能想出以下:

SET @a := (SELECT GROUP_CONCAT(id) FROM someTable where yourBooleanExpressionHere); 
SELECT * FROM wordbase WHERE FIND_IN_SET(verified, @a); 
0
SELECT GROUP_CONCAT(field_table1 SEPARATOR ',') FROM table1 into @var; 

然後

SELECT * FROM table2 WHERE field_table2 in(@var); 

工作正常,我

+0

我不明白這是如何工作的。第一個查詢在將其轉換爲字符串後創建一個大字符串,即「field_table1」的串聯。第二個查詢檢查'field_table2'是否等於那個大量的字符串。 – xhienne 2018-02-14 17:30:39