我有以下查询,工作方案是:
我有三张桌子。类别,角色和角色_to_categories表。
roles_to_categories表:
--id-- --role_id-- --category_id--
角色表中的角色可以绑定到名为roles_to_categories
的数据透视表中的多个类别。我想要一个角色,例如admin
来获取表categories
中绑定到它的表roles_to_categories
中的所有类别。
它工作正常,但问题出在聚合时:GROUP_CONCAT()
。
我想获取父类别列表,并使用GROUP_CONCAT()
将其子项包含在单独的列中。我的问题是GROUP_CONCAT()
在检索子项列表时似乎忽略了roles_to_categories数据透视表,这意味着它包含了某个类别中不允许的子项(我的意思是{{1}中没有记录将它绑定到一个角色)
查询是:
roles_to_categories
它从所有三个表中选择所需的列,从select categories.name as cat_name, categories.id as cat_id,
roles.name as role_name, roles.id as role_id, roles_to_categories.id as cat_id, roles_to_categories.role_id as role_id,
roles_to_categories.category_id,
group_concat('name: ', categories2.name) as cat_children
FROM roles left join roles_to_categories on roles.id = roles_to_categories.role_id
left join categories on roles_to_categories.category_id = categories.id
left join categories as categories2 on categories2.parent_id = categories.id
WHERE roles.name = "admin";
开始,然后从roles
到left joins
以获取其相关记录,然后从类别表中重新roles_to_categories
left-joins
选择在提取的记录中存在ID的类别......
答案 0 :(得分:1)
group_concat
是一个聚合 - 您需要按选择列表中的所有非聚合列进行分组。
您还在查询中包含了连接列两边的多个别名 - 这会让人感到困惑和多余,并且别名category.id
和roles_to_category.id
到cat_id
。
在这种情况下,由于您想要连接父类别的所有子项,因此会这样:
select
categories.name as cat_name, categories.id as cat_id,
roles.name as role_name, roles.id as role_id,
roles_to_categories.id as roles_to_cat_id,
group_concat('name: ', categories2.name) as cat_children
FROM
roles left join roles_to_categories
on roles.id = roles_to_categories.role_id
left join categories on roles_to_categories.category_id = categories.id
left join categories as categories2 on categories2.parent_id = categories.id
WHERE
roles.name = 'admin'
GROUP BY
categories.name, categories.id, roles.name, roles.id, roles_to_categories.id;