我必须使用MySQL数据库,其中一些列有不同的id保存在一列中,由管道字符分隔。例如:
Users表:
id | username | groups
1 | user1 | 1|2|3|5
组id对应组。它显示用户所在的组。这里还有一个Groups
表:
组表:
id | groupname
1 | group1
2 | group2
3 | group3
4 | group4
5 | group5
我要做的是选择一个用户,然后选择该用户所在的所有groupnames
,例如JOIN
。对于user1
这是所有组除了 group4
。
如果将组保存在另一个名为user_groups
的表中,这显然会更容易,该表如下所示:
user_groups表:
fk_user_id | fk_group_id
1 | 1
1 | 2
1 | 3
1 | 5
但是,不幸的是,我不能改变数据库模式,因为整个系统已经基于此。
我想知道在单个查询中选择用户时是否有一种获得所有组名的智能方法。例如,结果可能看起来像这样:
id | username | groups | groupnames
1 | user1 | 1|2|3|5 | group1|group2|group3|group5
是否有可能在MySQL的一个查询中做这样的事情?
在MySQL中,这种类型的连接可以使用find_in_set()
:
select *
from user u join
groups g
on find_in_set(g.groupname, u.groups) > 0;
在MySQL或其他数据库中,您也可以使用like
:
select *
from user u join
groups g
on concat('|', g.groupname, '|') like concat('%|', u.groups, '|%');