2013-10-23 16 views
1

我很難搞清楚如何爲我的查詢創建正確的語法。MySQL內部連接並將行變成柱子

這就是我拉。我有兩張桌子。

Table 1 : Fields (user_id, name) 
Table 2 : Fields (user_id, type, are_code, phone_number). 

表1只能具有每USER_ID 1個結果。

1 | John Doe 

表2最多可以有3條記錄每USER_ID:

1 | Home | 123 | 456.4567 
1 | Work | 000 | 987.1467 
1 | Mobi | 098 | 987.1756 

如何我可以選擇的一切,讓我的表將導致1個記錄拉着,像這樣:

user_id | name | home# | work# | mobi# 

我試過這個,它會複製和加倍行表2.

SELECT a.user_id, 
     b.area_code, b.phone_number 
FROM users a 
INNER JOIN user_contact_phones b ON a.user_id = b.user_id 

,不幸的是返回3行這是不好:(內根據條目的數量。

1 | John Doe | area | home# | 
1 | John Doe | area | work# | 
1 | John Doe | area | mobi# | 

任何幫助和或指針將不勝感激。

+0

你可以有多個。一個家庭類型爲同一個用戶? –

回答

2

嘗試了這一點:

SELECT 
    u.user_id, 
    u.name, 
    MAX(CASE WHEN p.type = 'Home' THEN phone_number END) HomeNumber, 
    MAX(CASE WHEN p.type = 'Work' THEN phone_number END) WorkNumber, 
    MAX(CASE WHEN p.type = 'Mobi' THEN phone_number END) MobiNumber 
FROM phones p 
JOIN users u ON p.user_id = u.user_id 
GROUP BY u.user_id, u.name 

輸出:

| USER_ID |  NAME | HOMENUMBER | WORKNUMBER | MOBINUMBER | 
|---------|----------|------------|------------|------------| 
|  1 | John Doe | 456.4567 | 987.1467 | 987.1756 | 

小提琴here

另請注意,如果u.user_id確定爲u.name ......您可以刪除u.name ......這很可能是因爲它似乎是主鍵。這會加快一點點。

注:這是假設你不能有相同的用戶不止一個同類型的(因爲它是在你的數據。例如,只對家庭,工作和移動一列

+0

僅供參考,將'u.name'留在GROUP BY子句之外是一個MySQL擴展。標準SQL要求所有非聚合列都在GROUP BY中。 – Barmar

+0

@Barmar。當然。這個問題被標記爲MySQL,所以不使用這種功能不會有任何意義,並導致性能下降。 –

+1

這也很好。 – ipixel

1

使用user_contact_phones.type得到確切你想要什麼,喜歡 -

SELECT a.user_id, 
     b.area_code, b.phone_number 
FROM users a 
INNER JOIN user_contact_phones b ON a.user_id = b.user_id where b.type='Home' 
+1

這隻會拉動「家庭」的電話號碼,我需要所有3個號碼,並將他們放在3個單獨的列。 – ipixel

0

這裏,將工作的解決方案:

select u.user_id, u.name, 
    thome.area_code as home_area_code, thome.phone_number as home_phone_number, 
    twork.area_code as work_area_code, twork.phone_number as work_phone_number, 
    tmobi.area_code as mobi_area_code, tmobi.phone_number as mobi_phone_number 
from table1 u 
    left outer join table2 thome on u.user_id = thome.user_id and thome.type = 'Home' 
    left outer join table2 twork on u.user_id = twork.user_id and twork.type = 'Work' 
    left outer join table2 tmobi on u.user_id = tmobi.user_id and tmobi.type = 'Mobi' 

請注意使用左外連接,而不是內加盟如果特定類型的記錄不存在。您將使用左外連接爲結果集中的那些列獲取空值。使用內部聯接,對於沒有全部三種類型的用戶,您不會得到結果。祝你好運!

+0

這工作非常好! – ipixel