群里的一个兄弟提到了这样一个关于在postgreSQL查询语句的问题:
一个表里面有三个字段,分别是id,parentid,name。现在给一个id,如何写一个函数,查询到一个结果,就是整个链子的名字的组合,就是给一个id,找他的parentid 一直找下去 最后返回他们的名字组合,例如:name3_name2_name1,循环终止的条件是parentid=0。
基本上是一个多级的表结构,比较常见于权限设计和分类目录设计里。
基本的表结构就是 Category(id,name,parentid)
要解决这个问题主要有三个步骤:
1. 递归查询获取结果集:with recursive
2. 结果集转为数组:array()
3. 数组拼接为结果:array_to_string(Array,"_")
查询语句如下:
select array_to_string ( ARRAY ( with recursive pp as ( select id,parentid from t_admin_power where id=10 union all select p.id,p.name,p.parentid from t_admin_power p inner join pp on p.id=pp.parentid ) select name from pp),'_' ) as concat