获取MYSQL来嵌套结果

时间:2015-04-21 16:49:20

标签: mysql

您好我正在尝试让MYSQL嵌套结果。

这是一个示例原始数据库。

id     name     parent_id
21     ccc      NULL
23     ccc      48
24     aaa      NULL
25     ddd      24
26     eee      NULL
48     bbb      NULL

我需要按此顺序输出

id     name     parent_id
24     aaa      NULL
25     ddd      24
48     bbb      NULL
23     ccc      48
21     ccc      NULL
26     eee      NULL

我需要MYSQL按顺序对名称进行排序,同时在“parent_id”之后立即嵌套“子”名称。子名称中的顺序也将按名称排序。

如何让MYSQL为我嵌套表?

2 个答案:

答案 0 :(得分:0)

你可以使用像

这样的东西
select id, name, parent_id from
(

select c.id as id, c.name as name, p.id as parent_id, p.name as sortname , 1 as sortchild
from t as p 
join t as c on c.parent_id = p.id

union 

select id, name , id, name , 0 
from t
where parent_id is null

) X
order by sortname, parent_id, sortchild

请参阅http://sqlfiddle.com/#!9/16764/11

这将问题分成几个步骤:

首先找到子行并与父母一起加入,使用父名称进行排序,并使用一个标志来表示其子行 - 此位

select c.id as id, c.name as name, p.id as parent_id, p.name as sortname , 1 as sortchild
    from t as p 
    join t as c on c.parent_id = p.id

然后找到所有父行(即那些具有null parent_id的行)并再次包含该名称以进行排序

select id, name , id, name , 0 
from t
where parent_id is null

最后将它们包装在一个联合中并对父名称进行排序

答案 1 :(得分:0)

这也可以仅通过自联接,不需要联合。 这仅适用于2个级别。

 SELECT p.name,
      p.id,
      p.name
      c.name child_name,
      c.id child_id
 FROM
     tablename p
 LEFT JOIN
     tablename c
     ON p.id = c.parent_id
 WHERE p.parent_id IS NULL
 ORDER BY p.name, child_name

WHERE确保只选择没有父级的记录。