2014-10-31 96 views
0
id     name    role    test  

------    --------   --------   -------- 
1     Name 1   Role 1    1,2  
2     Name 10   Role 10   3  
3     Name 100   Role 100   4  
4     Name 11   Role 11   5,6 


SET @val_find := ''; 

SELECT @val_find := test FROM `users` WHERE `users`.`role`= 'role 11'; 

SELECT @val_find AS test; 

生成以下的輸出:5,6逗號分隔的外鍵

它的工作很好,當我寫:

SELECT * FROM `users` WHERE `users`.`id` IN (5,6) 

爲什麼不是在這種情況下工作嗎?

SET @val_find := ''; 

    SELECT @val_find := test FROM `users` WHERE `users`.`role`= 'role 11'; 

    SELECT @val_find AS test; 

    SELECT * FROM `users` WHERE `users`.`id` IN (SELECT @val_find) 

回答

3

這是一個非常普遍的問題。你應該修正你的數據佈局,所以你不會在逗號分隔列表中存儲ID列表。逗號分隔的列表已經足夠糟糕,但將數字ID存儲爲字符串會使其更糟糕。

如果您因爲無法更改而無法使用此數據結構,請首先承諾,當您控制數據庫時,不會執行此類操作。然後,使用find_in_set()

where find_in_set(id, @val_find) > 0; 
+1

感謝@Gordon Linoff其工作正常,但我只是想知道,爲什麼在那種情況下didn't工作?做u有什麼想法?而其結果類似於搜索所需的結果(5,6) – 2014-11-05 06:36:40

+1

由於您的查詢是'users.id IN('5,6')',它與'users.id ='5,6'' 。 – 2014-11-05 12:42:22