2009-04-26 21 views
1

私は2つのテーブルstaffphonesを持っています。MySQLクエリを混乱させる

Staffには、フィールドが1つしかありません。staff_idです。 Phonesは、staff_id,phone_typeおよびnumberの3つのフィールドを有する。

すべてのスタッフのstaff_id、携帯電話番号、自宅電話番号を表示します。しかし、私は結果に別の列として携帯電話番号と自宅の電話番号を持つ方法を把握することはできません。これまで私が試してきたのは、両方のタイプの数字を同じ列に入れたものです。

SELECT staff.staff_id, phones.number 
FROM staff 
LEFT JOIN phones ON (staff.staff_id = phones.staff_id && (phones.field_type = 'Cell' || phones.field_type = 'Home')) 

答えて

1

値を列に割り当てることはできないため、この方法は使用できません。

SELECT staff.staff_id, cells.number, home.number FROM staff 
    JOIN phones AS cells ON (...) 
    JOIN phones AS home ON (...) 
    WHERE cells.field_type='Cell' AND home.field_type='Home'; 

それは動作しますが、あなたは1列にホームスタッフと携帯電話の番号を持っていません。
あなたは2が参加しなければならないでしょう。

1

電話機のテーブルに2回参加する必要があります。

SELECT staff.staff_id, cellPhones.number, homePhones.number, 
FROM staff 
LEFT JOIN phones cellPhones ON (staff.staff_id = phones.staff_id && phones.field_type = 'Cell') 
LEFT JOIN phones homePhones ON (staff.staff_id = phones.staff_id && phones.field_type = 'Home') 
2

をあなたはピボットクエリを使用する必要があり、以下の未テストコードのようなもの:

select staff.staff_id, 
     MAX(IF(phones.field_type='Cell', phones.number, null)) as Cell, 
     MAX(IF(phones.field_type='Home', phones.number, null)) as Home 
from staff, 
     phones 
where phones.staff_id = staff.staff_id 
group by staff.staff_id 

注 - また、携帯電話のテーブルに対して複数回のでしょう参加を上記のソリューションはより優れたパフォーマンスを発揮し、追加のphones.field_typesのために簡単に拡張することができます。

http://dev.mysql.com/doc/refman/5.1/en/select.html(「ピボット」を検索)も参照してください。