2010-08-02 3 views
1

У меня есть три таблицы, categories, и taggings. Таблица категорий складывается в виде вложенного набора с соответствующими столбцами id, lft, rgt и parent_id. Теги: id и name. Taggings имеет tag_id и taggable_id, что относится к categories.id.Включение MySQL-запросов как таблиц объединения, так и вложенных наборов

Если возможно, я хотел бы получить один запрос, возвращающийся в поле, скажем tag_list, строку, содержащую теги категории и всех ее предков. Поэтому, учитывая следующую схему:

Категории

id | parent_id | lft | rgt 
1 |  NULL | 1 | 6 
2 |   1 | 2 | 5 
3 |   2 | 3 | 4 

Метки

id | name 
1 | cool 
2 | rad 
3 | soup 

-осна-

id | tag_id | taggable_id 
1 |  1 |   1 
2 |  2 |   2 
3 |  3 |   3 

я хотел бы для запроса SELECT ??? FROM categories вернуться:

id |  tag_list 
1 |   cool 
2 |  rad cool 
3 | rad cool soup 

Фоновая информация: Я запускаю Rails, и я использую Thinking Sphinx для поиска и awesome_nested_set для вложенности. У меня есть таблица под названием categories, которая имеет множество tags в отношении has_many_through.

ответ

2
SELECT node_id, group_concat(name SEPARATOR ' ') 
FROM taggings INNER JOIN tags ON taggings.tag_id=tags.id 
INNER JOIN (SELECT node.id AS node_id, parent.id AS parent_id 
FROM categories AS node, 
categories AS parent 
WHERE node.lft BETWEEN parent.lft AND parent.rgt) subcategories 
ON subcategories.parent_id=taggings.taggable_id 
GROUP BY (node_id); 

Ну, я, например, узнал вещь или три делают, что :)

EDIT: Я не проверял это на MySQL, только SQLite, поэтому синтаксис не может быть 100%.

+0

Спасибо! Это работает замечательно, но я боюсь, что ваш SQL-fu достаточно выше моего уровня, что я не могу следовать вместе с вашей логикой, когда группировка рулонов. Я понимаю, как в скобках запроса в середине создается сопоставление категорий и предков, и я могу понять, как это полезно при определении унаследованных тегов категории, но я не понимаю, насколько точно все остальное входит в него. Если бы вы были так добры, чтобы помочь мне на этапах группировки, я был бы благодарен. –

+0

Следите за моим предыдущим комментарием ... неважно! Я понимаю это сейчас. Блестящая работа! –

+0

Вложенные наборы были новой частью для меня. Чтобы понять это, мне пришлось немного изменить ID, потому что это было слишком запутанно, поэтому я взял tag.id и tagggings.tag_id и умножил их на 10. Для группировки я использовал группу group_concat, который по существу работает как любая групповая функция (max, sum и т. д.), только она объединяется с идентификацией. Попробуйте его на более простой схеме, в одной таблице с повторными идентификаторами. – MPelletier

Смежные вопросы