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)
答案 0 :(得分:3)
这是一个非常常见的问题。您应该修复数据布局,这样就不会在逗号分隔列表中存储ID列表。逗号分隔列表已经足够糟糕,但将数字ID存储为字符串会使情况更糟。
如果您因为无法更改而无法使用此数据结构,请首先承诺,当您控制数据库时,您不会做这些事情。然后,使用find_in_set()
:
where find_in_set(id, @val_find) > 0;