首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何编写此查询,而不是将所有列分组为

问如何编写此查询,而不是将所有列分组为
EN

Stack Overflow用户
提问于 2017-05-07 09:31:41
回答 1查看 75关注 0票数 0

以下查询

代码语言:javascript
复制
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列的不同表上,所以每次都必须指定所有列,这是过份的。有什么解决办法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-07 11:01:51

您只需使用一个子查询来返回所需的Id,然后将主表链接到该查询。

这样,您就不需要在外部查询中指定列。

代码语言:javascript
复制
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.,第一种方法是一种更直接的方法来实现它。

代码语言:javascript
复制
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
);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43829936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档