У меня есть три таблицы, categories
, tags
, и taggings
. Таблица категорий соединена способом вложенного набора с соответствующими столбцами id
, lft
, rgt
, и parent_id
. Теги имеют id
и name
. Маркировки имеют 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
Вводная информация: я выполняю направляющие, и я использую Думающего Сфинкса для поиска и awesome_nested_set для вложения. Мне назвали таблицу categories
, который имеет многих tags
в a has_many_through
отношения.
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%.