MySQL查询合并了连接表和嵌套集

时间:2010-08-02 21:05:15

标签: sql mysql nested-sets

我有三个表,categoriestagstaggings。类别表以嵌套集的形式放在一起,包含相关列idlftrgtparent_id。标签包含idname。标记有tag_idtaggable_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

的Tagging

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 个答案:

答案 0 :(得分: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);

好吧,我为一个人学到了一两件事:)

编辑:我没有针对mysql检查它,只检查SQLite,所以语法可能不是100%。