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/

10-11 17:34