質問

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(最初の親のすべての子)

2 0番目の親

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

4 0 3番目の親

6 0 4番目の親

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

誰でも助けてもらえますか?

役に立ちましたか?

解決

これには再帰的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レベルを超えると壊れます。これが心配な場合は、さまざまな場所でゼロの数を調整する必要があります。

より良い方法があるかもしれませんが、これは機能します。

他のヒント

これは、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

私が知る限り、保存しているのが親IDだけである場合、1つのSQLステートメントでこれを行うことはできません。データツリーをすばやく取得する必要がある場合は、事前注文のトラバースを保存することを検討する必要があります。見た目よりも簡単で、ここで詳しく説明されています: http://articles.sitepoint。 com / article / hierarchical-data-database

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top