如何从Mysql中的Hierarchical数据处理数据库?

时间:2014-12-04 03:30:08

标签: mysql sql

我有这样的表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
...   ...         ...

2 个答案:

答案 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

上有关于这些分层数据和相关查询的完整记录