您好我正在尝试让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为我嵌套表?
答案 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确保只选择没有父级的记录。