您还使用 PostgreSQL 标记了这个问题,使用 Postgres 解决这个损坏的设计实际上很容易:
SELECT grp.groupname, r.roletitle
FROM groups grp
join (
select groupid, cast(regexp_split_to_table(roles, ',') as integer) as role_id
from privileges
) as privs on privs.groupid = grp.groupid
join roles r on r.roleid = privs.role_id;
SQLFiddle:http ://sqlfiddle.com/#!12/5e87b/1
(注意我把拼写错误的名字改成了preveleges
正确的拼写privileges
)
但是你真的应该重新设计你的数据模型!
修复您的设计还使您能够定义外键约束并验证输入。'one,two,three'
在您当前的模型中,如果有人将值插入到角色表中,应用程序可能会中断(就像我的查询一样) 。
编辑
为了完成图片,使用 Postgres 的数组处理上述可以使用类似于 MySQL 的方法稍微简化find_in_set()
select grp.groupname, r.roletitle
from groups grp
join privileges privs on grp.groupid = privs.groupid
join roles r on r.roleid::text = any (string_to_array(privs.roles, ','))
在这两种情况下,如果所有角色标题都应显示为逗号分隔列表,则可以使用 string_agg() 函数(相当于 MySQL 的group_concat()
select grp.groupname, string_agg(r.roletitle, ',')
from groups grp
join privileges privs on grp.groupid = privs.groupid
join roles r on r.roleid::text = any (string_to_array(privs.roles, ','))
group by grp.groupname