我很难弄清楚如何为我的查询创建正确的语法。
这是我正在拉的。我有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 值。 使用内部联接,您将无法获得不具有所有三种类型的用户的结果。 祝你好运!