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/