【问题标题】:Recursive select?递归选择?
【发布时间】:2013-10-23 18:07:43
【问题描述】:

我的表结构如下:

所以每个论坛帖子都有一个父级,谁也有一个父级(除了根帖子),等等。 我需要的是获取一个论坛帖子的孩子总数,包括他的孩子的孩子,孙子的孩子等等。

现在我有一个简单的选择,可以返回直接的孩子:

select count(*) as child_count 
from forumposts 
where parent_forum_post_id = $criteria.fid

我什至不确定这是否可以通过 sql 实现,但我是 SQL 的初学者,所以我想也许有人可以提供一些想法。

感谢任何帮助。谢谢。

【问题讨论】:

  • 这个帖子可能有帮助:stackoverflow.com/questions/1323245/…
  • 下次请以INSERT声明的形式发布样本数据。或者至少作为文本。这样一来,回答问题的人就可以更轻松地设置包含数据的测试表。

标签: sql postgresql


【解决方案1】:

应该这样做:

with recursive all_posts (id, parentid, root_id) as 
(
  select t1.id, 
         t1.parent_forum_post_id as parentid, 
         t1.id as root_id
  from forumposts t1
  where t1.parent_forum_post_id is null

  union all

  select c1.id, 
         c1.parent_forum_post_id as parentid,
         p.root_id
  from forumposts c1
    join all_posts p on p.id = c1.parent_forum_post_id
)
select root_id, count(*)
from all_posts
order by root_id;

可以通过修改条件where t1.parent_forum_post_id is null来改变“起点”。

【讨论】:

    【解决方案2】:
    【解决方案3】:

    在 Postgresql 中是 WITH RECURSIVE

    【讨论】:

      【解决方案4】:
      WITH RecursiveCte AS
      (
      SELECT 1 AS LEVEL,
             H1.intUserId,
             H1.intReportsTo,
             H1.strUserName
      FROM   mstUsers H1
      WHERE  id = @intUserId
      UNION ALL
      SELECT RCTE.level + 1 AS LEVEL,
             H2.intUserId,
             H2.intReportsTo,
             H2.strUserName
      FROM   mstUsers H2
             INNER JOIN RecursiveCte RCTE
                  ON  H2.intReportsTo = RCTE.
      )
      SELECT intUserId,strUserName,LEVEL FROM RecursiveCte
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-17
        • 2018-12-31
        • 1970-01-01
        • 1970-01-01
        • 2015-02-13
        • 2023-03-29
        • 2012-09-20
        相关资源
        最近更新 更多