非常に基本的な1つのテーブルのシナリオがあります。
tblFamiles
entryID : Int
name: Text
parentID: Int
次の行を追加しましょう。
entryID : name : parentID
1 : Grandmother Jones : 0
2 : Grandmother Thompson : 0
3 : Mother Jones : 1
4 : Mother Thompson : 2
5 : 1st Daughter Jones : 3
6 : 2nd Daughter Jones : 3
7 : 1st Daughter Thompson : 4
ここには、ジョーンズ家とトンプソン家の3世代の2つの家族が保管されています(例として)。このテーブルをクエリしたいのですが、結果をparentIDで並べ替えます(ただし、単純な古いものとは異なりORDER BY 'parentID' DESC、相対的な順序になります。次のような出力が必要です。
SELECT (SOME MAGIC) FROM `tblFamiles`;
entryID : name : parentID
1 : Grandmother Jones : 0
3 : Mother Jones : 1
5 : 1st Daughter Jones : 3
6 : 2nd Daughter Jones : 3
2 : Grandmother Thompson : 0
4 : Mother Thompson : 2
7 : 1st Daughter Thompson : 4
論理的には、これを行う方法を確認できる唯一の方法は、すべてのentryIDをループしてから、各entryIDをループすることです。他のすべてのレコードをループして、parentIDフィールドを現在のentryIDと照合し、それらのレコードを結果セットの一番上、現在の行の下に移動します。しかし、MySQLでそれを行う方法がわかりません。
アップデート
上記の例としてファミリを使用しましたが、私が求めているのは、ネストされたエントリを格納し、それらを1つのクエリで取得する方法です。複数のSELECTクエリを実行することもできますが、それは醜いです。
(Pseudo)
SELECT entryID, name WHERE parentID = 0 LIMIT 0,1;
print name;
Sub query:
SELECT entryID, name WHERE parentID = $above-entryID
print name;
(Keep looping through this till the second query returns no results,
then go back to the first query and move onto the next entryID)
2回目の更新
列が存在することさえ忘れることができますname。例としてそれを使用しました。ここで重要なのは、すべてentryIDをparentIDリンクして制御する2つの列です。と同様に20の追加の列が存在する可能性がありますnameが、それらはすべて、リンクまたはネストされた(どちらの用語がより適切であるか)IDをentryID中心に展開します。parentID