以下查询
SELECT child.*
FROM [nested-set] AS parent
JOIN (
SELECT [lft] AS parentLft, [rgt] AS parentRgt
FROM [nested-set] WHERE [id] = 3
) AS parent2 ON 1=1
JOIN [nested-set] AS child ON child.[lft] BETWEEN parent.[lft] AND parent.[rgt]
WHERE parent.[lft] >= parentLft AND parent.[rgt] < parentRgt AND parent.[id] > 1
GROUP BY child.[id]
HAVING COUNT(child.[id]) = 1
ORDER BY child.[lft] ASC这将获得嵌套集模型中节点的子节点,该模型在MySQL和SQLite上运行得非常好(当然,使用不同的列引用),但是为了使其在MySQL上工作,我必须添加GROUP子句中的所有列。由于这个查询应该运行在只具有id、lft和rgt列的不同表上,所以每次都必须指定所有列,这是过份的。有什么解决办法吗?
发布于 2017-05-07 11:01:51
您只需使用一个子查询来返回所需的Id,然后将主表链接到该查询。
这样,您就不需要在外部查询中指定列。
SELECT t.*
FROM(
SELECT child.id
FROM [nested-set] headparent
JOIN [nested-set] parent ON (parent.lft >= headparent.lft AND parent.rgt < headparent.rgt)
JOIN [nested-set] child ON (child.lft BETWEEN parent.lft AND parent.rgt)
WHERE headparent.id = 3
AND parent.id > 1
GROUP BY child.id
HAVING count(*) = 1
) q
JOIN [nested-set] t ON t.id = q.id
ORDER BY t.lft ASC;因为这几乎是“旧标准SQL”(f.e。不使用窗口函数),这也应该适用于MySql或SQLite。
后圣经:
我想知道是否有可能使用现有的。
从下面的实验来看,确实是这样。如果你不使用小组。
但是i.m.h.o.,第一种方法是一种更直接的方法来实现它。
declare @NestedSet table (id int, lft int, rgt int, colA int);
insert into @NestedSet (id,lft,rgt,colA) values
(1,3,5,100),
(2,4,5,200),
(3,3,6,300),
(4,3,5,400),
(5,4,6,500);
select *
from @NestedSet t
where exists (
select 1
from @NestedSet headparent
join @NestedSet parent on (parent.lft >= headparent.lft and parent.rgt < headparent.rgt and parent.id > 1)
where headparent.id = 3
and t.lft between parent.lft and parent.rgt
having count(*) = 1
);https://stackoverflow.com/questions/43829936
复制相似问题