id parent_id
1 0
2 0
3 2
4 0
5 1
6 0
我需要一个返回父行(parent_id = 0)然后是子行
的查询第一位父母
第一位父母的所有孩子
第二位父母
第二位父母的所有孩子
第三位父母
第四位父母
预期结果:按ID排序
id parent_id
1 0(第一位父母)
5 1(第一父母的所有孩子)
2 0秒的父母
3 2(所有第二父母的子女)
4 0第三位父母
6 0第四位父母
我可以使用所有孩子的父母联盟 但这给了我父母的第一个孩子。 我需要父母及其子女。
任何人都可以提供帮助吗?
答案 0 :(得分:3)
以下是使用带order by子句的union的示例解决方案(虽然它不适用于深度嵌套)。
SELECT p.id,
p.parent_id,
p.name,
p.id AS sequence
FROM topics AS p
WHERE p.parent_id = 0
UNION
SELECT t.id,
t.parent_id,
t.name,
t.parent_id AS sequence
FROM topics AS t
WHERE t.parent_id <> 0
ORDER BY sequence, parent_id, name
答案 1 :(得分:1)
据我所知,如果您存储的所有内容都是父ID,则无法使用单个SQL语句执行此操作。如果需要快速检索数据树,则必须考虑存储预订遍历。它听起来比听起来容易,而且在这里有很好的描述:http://articles.sitepoint.com/article/hierarchical-data-database
答案 2 :(得分:0)
您将使用递归CTE:
WITH r AS
(SELECT id,
NULL AS parent_id,
CAST(right('000' + CAST(row_number()
OVER (table.id) AS varchar), 3) AS varchar(50))
FROM table WHERE parent IS NULL
UNION ALL
SELECT table.id, table.parent_id,
CAST(r.ord + right('000' + CAST(row_number()
OVER (ORDER BY table.id) AS varchar), 3) AS varchar(50))
FROM r JOIN table
ON table.parent = r.id)
SELECT id
FROM r
ORDER BY left(ord + '000000000000000000000000000000000', 36)
请注意,如果任何ID的值大于999,则此特定版本将中断,如果您的级别超过12,则会中断。如果您担心这一点,则需要调整各个地方的零数。
可能有更好的方法,但这个方法有效。