2012-04-27 19 views
1

私はここにCASEを使用する必要がありますが、わかりません。私は一般的なテーブルからセックス(m/f)を取ろうとしており、セックスに応じて、対応するテーブルからビルドを取得します。たとえば、性別がmの場合、クエリでは男性表に移動して男性ビルドを選択することがわかります。私は私が達成しようとしているかのアイデアを与えるためにサンプルクエリと一緒に出力をまとめ:MySQL - テーブル内の行の値に応じて異なるテーブルから行の値を取得

members table 
member_id | member_name 
------------------------ 
    1   Herb 
    2   Karen 
    3   Megan 
    4   Pablo 

males table 
male_id | member_id | male_build 
--------------------------------- 
    1   1  muscular 
    2   4   fat 

females table 
female_id | member_id | female_build 
------------------------------------- 
    1   2   thin 
    2   3   fat 

general table 
general_id | member_id | sex 
----------------------------- 
    1   1   m 
    2   2   f 
    3   3   f 
    4   4   m 

出力は次のようにする必要があります:

1. Herb is a muscular male. 
2. Karen is a thin female. 
3. Megan is a fat female. 
4. Pablo is a fat male. 
    -> query = "SELECT g.general_id, g.member_id, g.sex, 
       (CASE when g.sex=m THEN SELECT ma.male_build AS build 
        FROM males ma WHERE ma.member_id=g.member_id, 
       CASE when g.sex=f THEN SELECT fe.female_build AS build 
        FROM females fe WHERE fe.member_id=g.member_id), 
       m.member_name 
       FROM members m 
       JOIN members m ON g.member_id=m.member_id 
       WHERE g.sex='m' OR g.sex='f'"; 

ための効率的なクエリを探してこの仕事。

+2

テストスキーマ:http://www.sqlfiddle.com/#!2/465ca – mellamokb

答えて

1

このようなクエリを実行する必要がある場合は、データベース設計スキーマを再考することをお勧めします。言われていることを、この作業をする必要があります:私はちょうどbuild_typesテーブルとあなたのmembersテーブルに外部キーを持っていると思います

SELECT mem.*, g.*, coalesce(m.male_build, f.female_build) as build 
from members_table mem 
inner join general g on mem.meber_id = g.member_id 
left join males m on mem.member_id = m.member_id 
left join females f on mem.member_id = f.member_id 
+0

回答ありがとうございますが、私は一般的なテーブルを統合することでそれを行う必要があります。どのようなアイデア? – Wonka

+0

一般的なテーブルを統合するために私の応答を編集しました。 – therealmitchconnors

0
Select M.member_name + ' is a ' 
    + gender_attributes.sex_name 
    + ' ' 
    + gender_attributes.build 
From members As M 
    Join general_table As G 
     On G.member_id = M. member_id 
    Join (
      Select 'm' As sex, 'male' As sex_name, male_id as id, member_id, male_build As build 
      From males_table  
      Union All 
      Select 'f' As sex, 'female', female_id, member_id, female_build 
      From females_table 
      ) As gender_attributes 
     On gender_attributes.sex = G.sex 
      And gender_attributes.member_id = M.member_id 
+1

答えをいただきありがとうございますが、私は出力テンプレートにphpを使用しますので、余分なものがたくさんあります。私はあなたのクエリをこのhttp://www.sqlfiddle.com/#!2/ef129/5に少し下げようとしましたが、うまくいきません。私は、一般的なテーブルのm/f値に基づいて、対応するテーブルのビルドを取得する必要があります – Wonka

+0

@Wonka - あなたのリンクのクエリの問題は、あなたがユニオンにID(male_id、female_id)を含めなかったことですクエリ – Thomas

0

。それは端のケースかもしれませんが、あなたは筋肉の女性と細い男を得ることができます。

関連する問題