mysql是否对选定行的子行进行计数,并将选定行作为父行?

laik7k3q  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(337)

表结构(代表性)

ID   NAME     PARENT
--------------------
1    cat1     0
2    cat1     1
3    cat2     1
4    cat1     2
5    cat2     2
6    cat3     2
7    cat1     3
8    cat2     3
9    cat3     3
10    cat1    1

外部\子\类别\计数的外部表数据

id_parent   name
-----------------------
    2            a
    2            b
    2            c
    3            a
    3            b
    3            c

类别可以有子类别。

SELECT t.name,t.id
FROM TABLE_NAME AS t
WHERE t.parent = SOME_ID

some_id=1给出了所有类别的名称、id和父id
我想得到的是除了t.id是子类别父级的名称之外,上面结果集中每一行的所有子类别的计数,并从另一个与父级具有相同t.id的表中获得类别的计数
预期结果

t.id   t.name  sub_category_count  foreign_sub_category_count
2       cat1         3                        3
3       cat2         3                        3
10      cat1         0                        0
3b6akqbq

3b6akqbq1#

我怀疑您正在寻找一个递归查询—在mysql 8.0中可用:

with recursive cte as (
    select id root_id, id from mytable
    union all
    select c.root_id, t.id from cte c inner join mytable t on t.parent = c.id
)
select 
    t.*,
    (select count(*) - 1 from cte c where c.root_id = t.id) no_children
from mytable t

这将向原始表中添加一列,其中包含当前行的直接和间接后代数。

fruv7luv

fruv7luv2#

试试这个:

select 
tab1.id, 
tab1.name, 
coalesce(tab2.counts,0) as sub_category_count,
coalesce(tab3.counts,0) as foreign_sub_category_count
from 

(select id,name,parent from representative) tab1

left join 

(select t1.parent tab_id, count(*) as counts  from representative t1 inner join representative t2 on t1.parent=t2.id group by t1.parent) tab2
on tab1.id=tab2.tab_id

left join 

(select parent_id,count(*) as counts from foreign_table group by parent_id) tab3 

on tab1.id=tab3.parent_id

where tab1.parent=1 --SOME_ID

您可以在中更改父项id where tab1.parent=1 你自己选择
db fiddle示例

相关问题