非常に基本的な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