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)
最佳答案
这是一个非常普遍的问题。您应该修复数据布局,以免将ID列表存储在以逗号分隔的列表中。用逗号分隔的列表已经够糟了,但是将数字id存储为字符串会使情况变得更糟。
如果由于无法更改而无法使用此数据结构,请首先保证在控制数据库时,您不会这样做。然后,使用find_in_set()
:
where find_in_set(id, @val_find) > 0;
关于mysql - 逗号分隔的外键,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26674891/