GROUP_CONCAT合并多行查询结果

  • 1 菜单表


    menus
  • 2 资源表(管理不同类型的资源)

resources
  • 3 角色资源表


    role_resources
  • 4 角色表


    roles

基于以上四张表,需要实现的是查询菜单信息列表的同时获取到该菜单分配给哪些角色,如下图:

效果

四张表中资源表和角色资源表作为中间表,联结菜单表和角色表

  • 联表查询
SELECT 
    m.*, 
    c.name AS 'role' 
FROM menus AS m 
JOIN resources AS a ON a.detail_id = m.id 
JOIN role_resources AS b ON b.resource_id = a.id 
JOIN roles AS c ON c.id = b.role_id
联表查询

联表后获取到了角色信息,还需要将相同id的行进行合并

SELECT 
    m.*, 
    GROUP_CONCAT(DISTINCT(c.name)) AS 'groups'
FROM menus AS m 
JOIN resources AS a ON a.detail_id = m.id 
JOIN role_resources AS b ON b.resource_id = a.id 
JOIN roles AS c ON c.id = b.role_id
GROUP BY id
LIMIT 0, 10
最终效果

总结:

  • GROUP_CONCAT函数的作用将相同组的数据进行合并
  • GROUP_CONCAT函数需要与group by配合使用

你可能感兴趣的:(GROUP_CONCAT合并多行查询结果)