如何获得树中根节点的最大引用数

How to get max count of referral to a root node in a tree

我有一个 table 用户结构如下:

id   name  parent_id
1    Mike     
2    Jack     1
3    Sam      1
4    Kurt     1
5    Somebody 3
6    Tommy    4
6    etc..    2

如何获得每个用户第一级嵌套的最大推荐数,通过这个例子我期望结果:

3 because Jack, Sam, Kurt is a referral of Mike on first level

假设 "first level" 由 parent_id IS NULL 和当前版本 Postgres 9.4 定义:

SELECT parent_id, count(*) AS referral_ct
FROM  (
   SELECT id AS parent_id
   FROM   tbl
   WHERE  t1.parent_id IS NULL
   ) t1
JOIN   tbl t2 USING (parent_id)
GROUP  BY 1
ORDER  BY 2 DESC
LIMIT  1;  -- to only get 1 row with max. referral_ct

只有几个根节点,JOIN LATERAL可能会更快:

SELECT t1.id, t2.referral_ct
FROM  (
   SELECT id
   FROM   tbl
   WHERE  parent_id IS NULL
   ) t1
LEFT  JOIN LATERAL (
   SELECT parent_id, count(*) AS referral_ct
   FROM   tbl
   WHERE  parent_id = t1.id
   GROUP  BY 1
   ) t2 ON true
ORDER   BY 2 DESC
LIMIT   1;  -- to only get 1 row with max. referral_ct

相关,更多解释:

  • Optimize GROUP BY query to retrieve latest record per user