簡體   English   中英

MySQL內連接AND將行轉換為列

[英]MySQL inner join AND turn rows into colums

我很難弄清楚如何為我的查詢創建正確的語法。

這就是我要拉的東西。 我有2張桌子。

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

表1每個user_id只能有1條記錄。

1 | John Doe

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

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# |

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

試試這個:

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 |

在這里小提琴

另請注意,如果u.user_id確定了u.name ,則可以刪除u.name ...這很可能是因為它似乎是主鍵。 這樣可以加快速度。

注意:這假設您不能為同一個用戶提供多個相同的類型(就像在示例數據中一樣,它只有一列用於家庭,工作和移動。

使用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'

這是一個有效的解決方案:

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'

請注意,如果特定類型的記錄不存在,則使用左外連接而不是內連接。 您將使用左外連接為結果集中的那些列獲取空值。 使用內部聯接,您將無法獲得沒有所有三種類型的用戶的結果。 祝好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM