2014-10-31 57 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