【问题标题】:SQL: Getting immediate subordinates of node in nested setSQL:在嵌套集中获取节点的直接下属
【发布时间】:2017-02-06 23:28:21
【问题描述】:

我使用this article 作为使用嵌套集模型创建数据库树结构的指南。 但是,我无法让它工作:当我执行以下查询时:

SELECT node.name, (COUNT(parent.name) - 1) AS depth
FROM nested_category AS node,
        nested_category AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
GROUP BY node.name
ORDER BY node.lft;

我收到此错误:

#1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and
contains nonaggregated column 'test.node.lft' which is not
functionally dependent on columns in GROUP BY clause; this is 
incompatible with sql_mode=only_full_group_by

那篇文章的 cmets 中有人建议按 ID 而不是名称进行分组,因此我将 GROUP BY node.name 替换为 GROUP BY node.category_id 并且可行。

但是,文章中的其他一些查询仍然不起作用。我想选择一个节点的直接子节点,例如:

SELECT node.name, (COUNT(parent.name) - (sub_tree.depth + 1)) AS depth
FROM nested_category AS node,
        nested_category AS parent,
        nested_category AS sub_parent,
        (
                SELECT node.name, (COUNT(parent.name) - 1) AS depth
                FROM nested_category AS node,
                        nested_category AS parent
                WHERE node.lft BETWEEN parent.lft AND parent.rgt
                        AND node.name = 'PORTABLE ELECTRONICS'
                GROUP BY node.name
                ORDER BY node.lft
        )AS sub_tree
WHERE node.lft BETWEEN parent.lft AND parent.rgt
        AND node.lft BETWEEN sub_parent.lft AND sub_parent.rgt
        AND sub_parent.name = sub_tree.name
GROUP BY node.name
HAVING depth <= 1
ORDER BY node.lft;

但我无法让它工作,因为我不知道它是如何工作的(也不知道从哪里开始)。有人可以逐步解释如何理解这些查询吗?

我正在使用 MySQL Ver 14.14 Distrib 5.7.17。

非常感谢!
彼得

【问题讨论】:

  • 编辑您的问题并解释您要做什么。语法错误很明显。意图不是。
  • @Gordon:现在我正在关注我在帖子中提到的文章,一旦它起作用,我希望能够在我自己的数据中选择给定节点的直接子节点base,与文章中的示例数据库结构相同。我只需要有人分解这些查询并解释它们(应该)如何工作。

标签: mysql sql hierarchical-data nested-sets


【解决方案1】:

您好,我正在使用相同的查询,它对我来说工作正常。

SELECT node.name, (COUNT(parent.name) - (sub_tree.depth + 1)) AS depth
FROM nested_category AS node,
    nested_category AS parent,
    nested_category AS sub_parent,
    (
            SELECT node.name, (COUNT(parent.name) - 1) AS depth
            FROM nested_category AS node,
                    nested_category AS parent
            WHERE node.lft BETWEEN parent.lft AND parent.rgt
                    AND node.id= 36
            GROUP BY node.name
            ORDER BY node.lft
    )AS sub_tree
WHERE node.lft BETWEEN parent.lft AND parent.rgt
    AND node.lft BETWEEN sub_parent.lft AND sub_parent.rgt
    AND sub_parent.name = sub_tree.name
GROUP BY node.name
HAVING depth = 1
ORDER BY node.lft;

使用 node.id 代替 node.name 并将 HAVING depth

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多