MySQL 内部连接并将行转换为列


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'

请注意,如果特定类型的记录不存在,请使用左外连接而不是内连接。 您将在具有左外连接的结果集中获得这些列的 null 值。 使用内部联接,您将无法获得不具有所有三种类型的用户的结果。 祝你好运!