【问题标题】:MySQL query incorporation both join tables and nested setsMySQL 查询合并连接表和嵌套集
【发布时间】:2010-08-02 21:05:15
【问题描述】:

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

标签

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 的表,它在has_many_through 关系中有许多tags

【问题讨论】:

    标签: sql mysql nested-sets


    【解决方案1】:
    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%。

    【讨论】:

    • 谢谢!这非常有效,但我担心你的 SQL-fu 远远高于我的水平,一旦分组开始,我就无法遵循你的逻辑。我了解中间的括号查询如何构建类别和祖先的映射,并且我可以看到这对确定类别的继承标签有何帮助,但我不知道它的其余部分究竟如何适合。如果您能在分组步骤上帮助我,我将不胜感激。
    • 对我之前的评论的跟进......没关系!我现在明白了。干得漂亮!
    • 嵌套集对我来说是新的部分。为了理解这一点,我不得不稍微更改一下 ID,因为它太混乱了,所以我将 tag.id 和 tagggings.tag_id 乘以 10。对于分组,我所做的是使用 group_concat,它本质上是像任何组函数(最大值、总和等)一样工作,只是它在身份上连接。在更简单的架构上尝试它,即具有重复 ID 的单个表。
    • 我不确定你所说的乘以 10 是什么意思。想详细说明一下吗?另外,我觉得将你所说的parent_idparent 称为ancestor_or_self_idancestor_or_self 在语义上更合适。
    • 是的,我认为您的“ancestor_or_self_id”是正确的。至于乘以我的 10,只是我一直在从一个表到另一个表中看到相同的 ID,尽可能关注结构而不是数据本身,所以我通过稍微更改 ID 来消除这种干扰,但是保持相同的结构。
    猜你喜欢
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多