2009-06-30 9 views
0

のMySQL:データを形成するために、SQLクエリ

Table_A 
------------ 
id name 
1 Name1 
2 Name2 


Table_B 
------------ 
a_id type value 
1 width 100 
1 height 100 
1 color red 
2 width 50 
2 height 80 

それはTable_Bに存在するどのように多くのタイプ値は不明です。

id name width height color 
1 Name1 100 100  red 
2 Name2 50 80  null 

答えて

1
SELECT a.id, a.name, b_Width.value AS width, b_Height.value AS height, b_color.value AS color 
FROM Table_A AS a 
JOIN Table_B AS b_Width 
    ON b_Width.a_id = a.id AND b_Width.type = 'width' 
JOIN Table_B AS b_Height 
    ON b_Height.a_id = a.id AND b_Height.type = 'height' 
JOIN Table_B AS b_Color 
    ON b_Color.a_id = a.id AND b_Color.type = 'color' 

しかし、真剣にあなたのスキーマを再設計を検討:その結果を取得する方法

。値は色と線形寸法を保持していますが、それが異なって設計された方が良いでしょう。

テーブルをそのまま保持しますが、幅/高さ/色の列を持つ詳細というテーブルがあります。または、幅/高さの列を持つSizeというテーブルと、色名またはRGB値を持つColorというテーブルがあります。追加の各テーブルには、テーブルのPKとして使用される場合と使用されない場合があるFK to TableAがあります。選択ID、名前などのサブクエリ

0

使用選択クエリは、(table_B A_ID = table_A.idから種類を選択して、=「幅」と入力)このような

同じtable_Aから幅どおりあなたが必要とする別の列を追加することができます ok

1

基本的に構造化されたデータベースの構造化されていないデータを保持するので、私はデータベースのEAVのアンチパターンを使用することをお勧めしませんが、ここで何かがはるかに速く、内部結合

選択a.id、a.name、 MAX(ケースb.type = '高' 次いでb.value端)の高さとして、 MAX(ケースb.type = '幅'、次いで、B。値の終わり)を max(b.type = 'color'、b.value endの場合)とし、 をtest.tableaから、test.tableb bからa.id = b.a_id をaとします。 id

関連する問題