【问题标题】:Query to a nested sets table to exclude all marked substrees查询嵌套集表以排除所有标记的子树
【发布时间】:2015-04-06 20:20:18
【问题描述】:

我正在创建一个包含 leftright 列的嵌套集。有一个名为exclusion 的列。我想要做的是选择嵌套集中的所有行,但如果exclusion 列为真,则删除所有其他行,其leftright 列值适合排除行leftright 值之间.

假设我的结果如下所示:

id | left | right | exclusion
-----------------------------
1  | 1    | 14    | 0
2  | 2    | 13    | 0
3  | 3    | 4     | 0
4  | 5    | 10    | 1
5  | 6    | 7     | 0
6  | 8    | 9     | 0
7  | 11   | 12    | 0

运行我的查询,我希望结果排除第 4、5 和 6 行。4 因为排除列为真。 5 和 6,因为它们的左右值介于第 4 行的左右值之间。

我将如何实现这一目标?

【问题讨论】:

    标签: mysql sql filter group-by nested-sets


    【解决方案1】:

    使用Exists 运算符来确定记录的存在。试试这个。

    SELECT *
    FROM   Yourtable a
    WHERE  EXISTS (SELECT *
                   FROM   Yourtable b
                   WHERE  b.exclusion = 1
                          AND ( a.lefts NOT BETWEEN b.lefts AND b.rights
                                AND a.rights NOT BETWEEN b.lefts AND b.rights )) 
    

    【讨论】:

    • 这通常不起作用。它只是说当前节点(a)应该存在节点(b),其中(b)是排除项,它不在(a)的子树中。例如,将exclusion=1 设置为#1,您的查询仍会产生 (1,2,3,7),其中结果集应为空。
    【解决方案2】:
    SELECT c.*
    FROM   ns c
    JOIN   ns p ON p.left <= c.left AND p.right >= c.right
    GROUP BY c.id
    HAVING SUM(p.exclusion) = 0
    

    它表示根路径中exclusion 的总和应该为零,因此不会遇到被排除的父母。这是the SQL fiddle,以防万一。

    【讨论】:

      猜你喜欢
      • 2022-06-18
      • 2012-02-20
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 2020-10-04
      • 1970-01-01
      • 2019-04-21
      • 1970-01-01
      相关资源
      最近更新 更多