0

非常に基本的な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。例としてそれを使用しました。ここで重要なのは、すべてentryIDparentIDリンクして制御する2つの列です。と同様に20の追加の列が存在する可能性がありますnameが、それらはすべて、リンクまたはネストされた(どちらの用語がより適切であるか)IDをentryID中心に展開します。parentID

4

1 に答える 1

1

「しかし、MySQLでそれを行う方法がわかりません。」

短い答え

できません。

少し長い答え。

あなたが解決しようとしている問題は、リレーショナルデータベースが解決するための良い解決策であるという問題ではありません。あなたがやろうとしていることは、オブジェクトリレーショナルデータベースを必要とするでしょう。

理論については、2つの違いを読むことをお勧めします。

http://en.wikipedia.org/wiki/Relational_database

http://en.wikipedia.org/wiki/Object-relational_database

スタックオーバーフローに関する質問と同様に、それぞれが良い/悪い理由について。

https://stackoverflow.com/questions/800/object-Oriented-vs-relational-databasesまたは リレーショナルデータベースのオブジェクト指向のような構造

この回答を含めるhttps://stackoverflow.com/a/600765/778719これはコンピュータサイエンスのベトナムにつながり ます。

これは、実際にはリレーショナルデータベースへのオブジェクトのマッピングに関するものですが、発生したばかりの問題の深さ(および明らかな解決策の欠如)を示しています。

実際にもう一方が必要なときに一方を使用する際の実際の問題は、オブジェクトと相対インピーダンスの不一致と呼ばれます http://en.wikipedia.org/wiki/Object-relational_impedance_mismatch

実際におそらく有用な答え

あなたが説明した問題は、オブジェクトによって最もよく処理される問題です。今のところ、それらをリレーショナルデータベースに格納することに固執することをお勧めします。ロジックは、SQLレイヤーではなく、アプリケーションコードレイヤーに存在する必要があるという事実を受け入れるだけです。したがって、フェッチする必要がある場合は、データベースに対して複数のクエリを実行します。オブジェクトの各「オブジェクト」または場合によっては各「レイヤー」。

それはある時点まで機能し、その時点で問題をよりよく理解し、異なるテクノロジーを使用するか、少なくとも異なるソリューション間のトレードオフを理解するためのより良い立場に立つことができます。

恐ろしいボーナス

家系図ソフトウェアのサイクル

于 2012-08-11T14:18:49.820 に答える