连接表但空行需要0

时间:2015-07-18 06:31:16

标签: 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
-------------------------------------------
1       |  4        |  1002     |  20
2       |  1        |  1002     |  60  
3       |  5        |  1008     |  60
....

所以我要做的是为特定用户获取每个duration的{​​{1}}的SUM()。

这就是我的尝试:

type

可能会返回这样的内容:

    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 作为0中没有行的其他types的值。我的意思是我希望输出像这样:

tblRequest

我的意思是它应该获取所有类型的行,但是0作为type_id | type_name | duration ------------------------------- 1 | abb | 60 2 | cda | 0 3 | edg | 0 4 | hij | 20 5 | klm | 0 中没有行的那些类型的值

2 个答案:

答案 0 :(得分:2)

您可以在tblRequest上执行聚合,然后加入,使用left join处理丢失的行,coalescenull转换为0:< / p>

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

答案 1 :(得分:1)

cellfun(@(x) strcmp(x{1}, 'B') && strcmp(x{2}, '1W') && (str2num(x{3}) < 5434) && (str2num(x{4}) > 5436), cellfun(@(x) strsplit(x, '_'), cellname(:)', 'uni', 0))