2015-06-15 7 views
1

У меня следующий запрос: сценарий работы:Многопользовательский запрос MySQL имеет проблему

У меня есть три таблицы. Категории, Роли и Roles_to_categories.

roles_to_categories стол:

--id-- --role_id-- --category_id-- 

Роль в таблице ролей может быть связан с несколькими категориями в виде сводной таблицы с именем roles_to_categories. Мне нужна роль, например admin, чтобы получить все категории из таблицы categories, которые привязаны к ней в таблице roles_to_categories.

Работает нормально, но проблема в том, что агрегация входит в состав: GROUP_CONCAT(). Я хочу просто получить список родительских категорий и включить их детей в отдельный столбец, используя GROUP_CONCAT(). Моя проблема заключается в том, что GROUP_CONCAT(), кажется, игнорирует таблицу поворота role_to_categories, когда она извлекает список дочерних элементов, что означает, что она включает в себя дочерние элементы определенной категории, которая НЕ ДОПУСКАЕТСЯ (я имею в виду, что нет записи в 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 по категориям таблицы из roles_to_categories для выбора категорий чьи идентификаторы существуют в выбранных записях и ...

+0

Вам необходимо 'группе by' в необобщенных столбцов (то есть все, что в выберите, кроме 'group_concat') – StuartLC

+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; 
+0

Извините, кажется, вы не получили мой вопрос. Он по-прежнему включает нелегальный дочерний элемент в столбце 'cat_children'. –

+0

Я не совсем понимаю. График будет только повторять один уровень глубины подкатегорий (вам нужна рекурсивная глубина?). Кажется, не имеет значения, предварительно ли генерируется команда 'group_concat' в производной таблице и соединяется с ней. [SqlFiddles] (http://sqlfiddle.com/#!9/609aa/2) – StuartLC

+0

Было бы лучше, если бы оно было рекурсивным, хотя в настоящее время это не так. Моя проблема решена путем повторного присоединения к аналогичному запросу ... –