我有这样的表Location
:
ID, PID, Location
1 NuLL Country
2 1 City
3 2 County
4 3 District
5 4 Social
... ... ....
如何在MySQL中处理我的数据库,返回此信息:
ID, Location, Full Location
1 Country Country
2 City City-Country
3 County County-City-Country
4 District District-County-City-Country
5 Social Social-District-County-City-Country
... ... ...
答案 0 :(得分:2)
如果您只有一个父级,那么您可以使用此方法作为递归查询:
select id, location, @pid:=id as 'pid' ,
@newlocation:=if(pid is null,
location,
concat_ws(',',@newlocation,location)) newlocation
from (select * from Location order by pid) t
join (select @pid:=null, @newlocation:='') p
on coalesce(t.pid,0)=coalesce(@pid,0)
但是,如果您有多个父母,那么这只会返回其子女之一。它可以修改为使用单个父/子组合,但不能与多个父组合一起使用。
答案 1 :(得分:2)
在SQL世界中处理层次结构是一个棘手的情况,在许多情况下,编程语言提供了更好的选项来处理这类数据 - 例如字典和链表。
但是,您仍然可以通过对表进行别名来实现您想要的效果;
SELECT t1.ID, t1.Location,
CONCAT(
IF(ISNULL(t1.Location) , '', t1.Location)
, IF(ISNULL(t2.Location) , '', CONCAT('-',t2.Location))
, IF(ISNULL(t3.Location) , '', CONCAT('-',t3.Location))
, IF(ISNULL(t4.Location) , '', CONCAT('-',t4.Location))
) as Full_Location
FROM Locations as t1
left join Locations as t2 on t1.PID = t2.ID
left join Locations as t3 on t2.PID = t3.ID
left join Locations as t4 on t3.PID = t4.ID
这个例子假设你只想深入四。当然可以更深入,只需遵循相同的结构。
在http://ftp.nchu.edu.tw/MySQL/tech-resources/articles/hierarchical-data.html
上有关于这些分层数据和相关查询的完整记录