Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 查询嵌套集合表以排除所有标记的子树_Mysql_Sql_Filter_Group By_Nested Sets - Fatal编程技术网

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