mysql - 逗号分隔的外键

标签 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)

最佳答案

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

如果您因为无法更改而受困于此数据结构,请首先保证当您控制数据库时,您不会做这样的事情。然后,使用 find_in_set():

where find_in_set(id, @val_find) > 0;

关于mysql - 逗号分隔的外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26674891/

相关文章:

mysql - 参数化表名

sql - 导轨/事件记录 : how to get SQL COUNT and SUM to work with Postgres (at heroku)

c# - 优化 LINQ 查询 - 如何缩短执行时间?

MySQL 坚持该字段不存在,然后告诉我它确实存在

mysql - 选择两个或多个(标志)列为 ON 的行

java - 使用具有相同 hibernate 映射文件的两个不同数据库

mysql - (SQL) 如何根据另一个表的 ID 将值添加到一个表中?

mysql - 仅选择与其他列表匹配的列表 [SQL]

c++ - 为什么 sqlite 的删除总是成功,即使要删除的行不存在?

sql - 外键减慢删除