Включение MySQL-запросов в таблицы соединений и вложенные множества - PullRequest
1 голос
/ 03 августа 2010

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

Если возможно, я бы хотел один запрос, который возвращает в поле, скажем 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.

1 Ответ

2 голосов
/ 03 августа 2010
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);

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

РЕДАКТИРОВАТЬ: я не проверял это на mysql, только SQLite, поэтому синтаксис может быть не 100%.

...