2016-10-31 12 views
0

ルームの情報とともにルームメイトのペアを探しています。 現在、私は MySQLテーブルの部分的な冗長性

以下の例のようなテーブルを取得することができます:

- Id1 Id2 Dorm room 
- 101 133 2a 1 
- 121 154 1b 3 
- 218 584 3a 2 
- 133 101 2a 1 
- 584 218 3a 2 
- 154 121 1b 3 

私はこの

- Id1 Id2 Dorm room 
- 101 133 2a 1 
- 154 121 1b 3 
- 218 584 3a 2 

のような表が、私はテーブルのように始めていた好きな冗長性をクリアする方法がわかりませんこの

- StuID Dorm room 
- 101 2a 1 
- 154 1b 3 
- 121 1b 3 
- ... 

ありがとう!

+0

簡単な質問は、あなたがルームメイトに戻ったときの順序です(例えば、101 133 2a 1でなければならないか、133 101 2a 1も可)。 – Ben

+1

結合で等値を使用しないでください。単に>を使用します。 – xQbert

+0

ベン:いいえ、それは問題ではありません。私はルームメイトの明確なペアを見つける必要があります – Eugene

答えて

0

studentIDの結合でequalsを使用しないでください。代わりに<または>を使用してください。

これは本当に各部屋に1人または2人のルームメイトがいる場合にのみ機能します。 3番目のものが存在すれば、別の解決法を生成する必要があります。

SELECT T1.StuID, T2.StuID, T1.Dorm, T1.Room 
FROM table T1 
LEFT JOIN Table T2 
on T1.Dorm = T2.Dorm 
and T1.Room = T2.Room 
and T1.StuID < T2.StuID 

これは、このように低くIDの学生は、常に最初の順序なし、重複を確保することになる、T2.StudentID未満にT1.StudentIDを強制します。

一部の部屋に1人しかいないとわからないので、左結合を使用しました。

+0

それを得ました!どうもありがとうございます!ちょうど2つ以上の人々が1つの部屋を共有している場合、私は何を使用すべきですか?私の質問の場合でさえそうではありません。 – Eugene

+0

これはいくつかの要因に依存します。すべての名前を表示する必要がありますか?部屋に何人いることができますか?部屋に4人しかいない場合は、単にT2.StuID xQbert

+0

他のデータベースのウィンドウ機能。 'Row_number()over(partition by dorm、StuIDによるroom order)'などの変数は、ユーザ変数を使ってmySQLでシミュレートできます。これらは、私たちが寮/部屋のコンボで各学生の行番号を生成することを可能にし、次にそれらの行番号を使用して、各生徒を結果セットの別々の列に割り当てることができます。定数(例えば4)があれば 'Pivot'文をシミュレートして行を列に切り替えることができます。しかし、それは1部屋あたりの既知の上限を必要とします。 – xQbert