1

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 第四父母

我可以使用父母联盟,然后是所有孩子,但这首先给我父母,然后是孩子。我需要父母和立即的孩子。

任何人都可以帮忙吗?

4

3 回答 3

4

这是一个使用带有 order by 子句的联合的示例解决方案(尽管它不适用于深度嵌套)。

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
于 2010-02-20T12:03:25.673 回答
1

据我所知,如果您存储的只是父 ID,则不能使用单个 SQL 语句执行此操作。如果您需要快速检索数据树,则必须考虑存储前序遍历。它比听起来更容易,并且在这里进行了很好的描述:http: //articles.sitepoint.com/article/hierarchical-data-database

于 2009-10-22T01:43:57.570 回答
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 个级别,它将中断。如果您对此感到担忧,则需要调整各个位置的零数。

可能有更好的方法,但这个方法有效。

于 2010-02-20T13:20:10.173 回答