逗号分隔外键

时间:2014-10-31 12:37:17

标签: mysql sql

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)

1 个答案:

答案 0 :(得分:3)

这是一个非常常见的问题。您应该修复数据布局,这样就不会在逗号分隔列表中存储ID列表。逗号分隔列表已经足够糟糕,但将数字ID存储为字符串会使情况更糟。

如果您因为无法更改而无法使用此数据结构,请首先承诺,当您控制数据库时,您不会做这些事情。然后,使用find_in_set()

where find_in_set(id, @val_find) > 0;