mysql多表查询的问题

在做权限管理的系统时:
group表中有一个rules字段(varchar),记录着组的规则id。 该id对应着rule表中的id。数据库用的mysql
图片描述

如何将规则部分显示rule的名称
sql查询该怎么写。

阅读 2.5k
3 个回答
SELECT GROUP_CONCAT(rule.rule_name) FROM `group` LEFT JOIN rule ON FIND_IN_SET(rule.id, `group`.rules)

注意 group 表名应该用 ` 符号。

假设表 group 是这样的

name rules
guest 1,2
user 1,2,5

而表 rule 是这样的

id name
1 r1
2 r2
5 r5

那么下面 SQL

SELECT group_name, GROUP_CONCAT(rule_name ORDER BY rule_id) AS rule_names FROM (
    SELECT `group`.name as group_name, rule.name AS rule_name, rule.id AS rule_id
        FROM `group` LEFT JOIN rule
        ON find_in_set(rule.id, `group`.rules)
) AS t GROUP BY group_name;

的结果是

group_name rule_names
guest r1,r2
user r1,r2,r5

个人理解如果数据库是这么设计的话,初衷是让在应用程序中处理:按照逗号分隔,逐条查询rule表,更常规的做法是用一个用户和规则的关联表。

如果非要用sql做关联查询,可以用FIND_IN_SET,不过效率不会太高。

select *
from 
(select '1,2,3,4,5' ids) t1 inner join (select 1 id, '张三' name union select 2, '李四') t2 
on FIND_IN_SET(t2.id, t1.ids) > 0
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题