Mysql 正在联接表,但空行需要0

Mysql 正在联接表,但空行需要0,mysql,sql,select,join,aggregate-functions,Mysql,Sql,Select,Join,Aggregate Functions,我不知道如何用语言来解释这个场景。因此,我在写例子: 我有一个名为tblType的表: type_id | type_name --------------------- 1 | abb 2 | cda 3 | edg 4 | hij 5 | klm 我还有另一个表名为tblRequest: req_id | type_id | user_id | duration ----------------

我不知道如何用语言来解释这个场景。因此,我在写例子:

我有一个名为
tblType
的表:

type_id  |  type_name
---------------------
1        |  abb
2        |  cda
3        |  edg
4        |  hij
5        |  klm
我还有另一个表名为
tblRequest

req_id  |  type_id  |  user_id  |  duration
-------------------------------------------
1       |  4        |  1002     |  20
2       |  1        |  1002     |  60  
3       |  5        |  1008     |  60
....
因此,我试图做的是,为每个
类型
获取特定用户的
持续时间
的总和()

这就是我所尝试的:

    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` 
它可能会返回如下内容:

type_id | type_name | duration
-------------------------------
1       |  abb      | 60
4       |  hij      | 20
type_id | type_name | duration
-------------------------------
1       |  abb      | 60
2       |  cda      | 0
3       |  edg      | 0
4       |  hij      | 20
5       |  klm      | 0
它起作用了。但问题是,我想将
0
作为其他
类型的值,这些类型在
tblRequest
中没有行。我的意思是我希望输出如下:

type_id | type_name | duration
-------------------------------
1       |  abb      | 60
4       |  hij      | 20
type_id | type_name | duration
-------------------------------
1       |  abb      | 60
2       |  cda      | 0
3       |  edg      | 0
4       |  hij      | 20
5       |  klm      | 0

我的意思是它应该得到所有类型的行,但是0作为那些在
tblRequest

中没有行的类型的值。您可以在
tblRequest
上执行聚合,然后才加入它,使用
左连接处理缺少的行,并
合并
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

令人惊叹的。像charmI guess一样工作,您也可以使用ISNULL(sum_duration,0)。一些解释会很有帮助。