多连接MySQL查询有一个问题

时间:2015-06-15 06:36:27

标签: mysql

我有以下查询,工作方案是:

我有三张桌子。类别,角色和角色_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"; 开始,然后从rolesleft joins以获取其相关记录,然后从类别表中重新roles_to_categories left-joins选择在提取的记录中存在ID的类别......

1 个答案:

答案 0 :(得分:1)

group_concat是一个聚合 - 您需要按选择列表中的所有非聚合列进行分组。

您还在查询中包含了连接列两边的多个别名 - 这会让人感到困惑和多余,并且别名category.idroles_to_category.idcat_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;
相关问题