У меня есть три таблицы, 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
.
Спасибо! Это работает замечательно, но я боюсь, что ваш SQL-fu достаточно выше моего уровня, что я не могу следовать вместе с вашей логикой, когда группировка рулонов. Я понимаю, как в скобках запроса в середине создается сопоставление категорий и предков, и я могу понять, как это полезно при определении унаследованных тегов категории, но я не понимаю, насколько точно все остальное входит в него. Если бы вы были так добры, чтобы помочь мне на этапах группировки, я был бы благодарен. –
Следите за моим предыдущим комментарием ... неважно! Я понимаю это сейчас. Блестящая работа! –
Вложенные наборы были новой частью для меня. Чтобы понять это, мне пришлось немного изменить ID, потому что это было слишком запутанно, поэтому я взял tag.id и tagggings.tag_id и умножил их на 10. Для группировки я использовал группу group_concat, который по существу работает как любая групповая функция (max, sum и т. д.), только она объединяется с идентификацией. Попробуйте его на более простой схеме, в одной таблице с повторными идентификаторами. – MPelletier