1

id parent_id

1 0

2 0

3 2

4 0

5 1

6 0

親行(parent_id = 0)とそれに続く子行を返すクエリが必要です

最初の親

最初の親のすべての子供

2番目の親

2番目の親のすべての子

3番目の親

4番目の親

期待される結果:ID順

id parent_id

1 0(最初の親)

5 1(最初の親のすべての子)

20番目の親

3 2(2番目の親のすべての子)

40第3の親

60第4親

私は親の結合を使用し、次にすべての子を使用できますが、それは私に最初に親、次に子を与えます。親とすぐにその子供が必要です。

誰でも助けることができますか?

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 に答える