Mysql 查询嵌套集合表以排除所有标记的子树
我正在创建一个包含Mysql 查询嵌套集合表以排除所有标记的子树,mysql,sql,filter,group-by,nested-sets,Mysql,Sql,Filter,Group By,Nested Sets,我正在创建一个包含左和右列的嵌套集。有一列名为排除。我要做的是选择嵌套集中的所有行,但如果排除列为true,则删除其左和右列值在排除行左和右值之间的所有其他行 假设我的结果如下所示: id | left | right | exclusion ----------------------------- 1 | 1 | 14 | 0 2 | 2 | 13 | 0 3 | 3 | 4 | 0 4 | 5 | 10 | 1 5 | 6
左
和右
列的嵌套集。有一列名为排除
。我要做的是选择嵌套集中的所有行,但如果排除
列为true,则删除其左
和右
列值在排除行左
和右
值之间的所有其他行
假设我的结果如下所示:
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因为排除列为true。5和6,因为它们的左右值在第4行的左右值之间匹配
我将如何实现这一点 使用
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 ))
选择c*
来自北卡罗来纳州
在p.left=c.right上连接ns p
按c.id分组
具有总和(p.排除)=0
它表示根路径中的
排除
之和应为零,因此不满足排除的父级。这是一个以防万一的例子。这通常不起作用。它只是说当前节点(a)应该存在节点(b),其中(b)是排除,它不在(a)的子树中。例如,为#1设置exclusion=1
,您的查询仍然会生成(1,2,3,7),其中结果集应该为空。
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