连接表但需要 0 空行
Joining tables but needs 0 for empty rows
我不知道如何用语言来解释这个场景。所以我在写例子:
我有一个 table 名为 tblType
:
type_id | type_name
---------------------
1 | abb
2 | cda
3 | edg
4 | hij
5 | klm
我还有另一个 table 名为 tblRequest
:
req_id | type_id | user_id | duration
-------------------------------------------
1 | 4 | 1002 | 20
2 | 1 | 1002 | 60
3 | 5 | 1008 | 60
....
所以我想做的是,为特定用户的每个 type
获取 duration
的 SUM()。
这是我试过的:
SELECT
SUM(r.`duration`) AS `duration`,
t.`type_id`,
t.`type_name`
FROM `tblRequest` AS r
LEFT JOIN `tblType` AS t ON r.`type_id` = t.`type_id`
WHERE r.`user_id` = '1002'
GROUP BY r.`type_id`
它可能 return 是这样的:
type_id | type_name | duration
-------------------------------
1 | abb | 60
4 | hij | 20
有效。但问题是,我想获得 0
作为其他 types
的值,它在 tblRequest
中没有一行。我的意思是我希望输出是这样的:
type_id | type_name | duration
-------------------------------
1 | abb | 60
2 | cda | 0
3 | edg | 0
4 | hij | 20
5 | klm | 0
我的意思是它应该获取所有类型的行,但是 0 作为那些在 tblRequest
中没有行的类型的值
您可以对 tblRequest
执行聚合,然后才加入它,使用 left join
处理丢失的行,使用 coalesce
将 null
转换为 0 :
SELECT t.type_id, type_name, COALESCE(sum_duration, 0) AS duration
FROM tblType t
LEFT JOIN (SELECT type_id, SUM(duration) AS sum_duration
FROM tblRequest
WHERE user_id = '1002'
GROUP BY type_id) r ON t.type_id = r.type_id
Select a.type_id, isnull(sum(b.duration), 0)
From tblType a Left Outer Join tblRequest b
ON a.type_id = b.type_id and b.user_id = 1002
Group by a.type_id
我不知道如何用语言来解释这个场景。所以我在写例子:
我有一个 table 名为 tblType
:
type_id | type_name
---------------------
1 | abb
2 | cda
3 | edg
4 | hij
5 | klm
我还有另一个 table 名为 tblRequest
:
req_id | type_id | user_id | duration
-------------------------------------------
1 | 4 | 1002 | 20
2 | 1 | 1002 | 60
3 | 5 | 1008 | 60
....
所以我想做的是,为特定用户的每个 type
获取 duration
的 SUM()。
这是我试过的:
SELECT
SUM(r.`duration`) AS `duration`,
t.`type_id`,
t.`type_name`
FROM `tblRequest` AS r
LEFT JOIN `tblType` AS t ON r.`type_id` = t.`type_id`
WHERE r.`user_id` = '1002'
GROUP BY r.`type_id`
它可能 return 是这样的:
type_id | type_name | duration
-------------------------------
1 | abb | 60
4 | hij | 20
有效。但问题是,我想获得 0
作为其他 types
的值,它在 tblRequest
中没有一行。我的意思是我希望输出是这样的:
type_id | type_name | duration
-------------------------------
1 | abb | 60
2 | cda | 0
3 | edg | 0
4 | hij | 20
5 | klm | 0
我的意思是它应该获取所有类型的行,但是 0 作为那些在 tblRequest
您可以对 tblRequest
执行聚合,然后才加入它,使用 left join
处理丢失的行,使用 coalesce
将 null
转换为 0 :
SELECT t.type_id, type_name, COALESCE(sum_duration, 0) AS duration
FROM tblType t
LEFT JOIN (SELECT type_id, SUM(duration) AS sum_duration
FROM tblRequest
WHERE user_id = '1002'
GROUP BY type_id) r ON t.type_id = r.type_id
Select a.type_id, isnull(sum(b.duration), 0)
From tblType a Left Outer Join tblRequest b
ON a.type_id = b.type_id and b.user_id = 1002
Group by a.type_id