当没有结果为'IN'条件的所有值时,SQL选择默认值

时间:2014-11-30 14:14:15

标签: mysql sql

我有一个用户列表的结果表:

     table: cdu_user_progress
    ---------------------------------
    |id |uid |duration |date        |
    ---------------------------------
    |1  |1   |20       |1392479414  |
    |2  |1   |30       |1392479414  |
    |3  |2   |20       |1392479345  |
    |4  |3   |40       |1392479812  |
    |5  |2   |20       |1392479994  |
    |6  |2   |60       |1392480100  |
    ---------------------------------

我需要在最近一周获得以下结果:

    -----------------------
    |uid |total_duration  |
    -----------------------
    |1   |0               |
    |2   |60              |
    |3   |0               |
    -----------------------

我得到的选择是:

    SELECT up.uid, SUM(up.duration) AS week_duration, 
    YEARWEEK(FROM_UNIXTIME(up.date)) AS yearweek 
    FROM cdu_user_progress up 
    WHERE 
    up.uid IN (1,2,3) 
    GROUP BY uid, YEARWEEK(FROM_UNIXTIME(up.date)) 
    HAVING yearweek = 201411

假设2014/11年度中唯一拥有“日期”的用户是用户2(记录6)。

所以我需要为那些在2014/11年度没有'日期'的用户返回0的默认记录......

1 个答案:

答案 0 :(得分:1)

使用left join

SELECT u.uid,
       COALESCE(SUM(up.duration), 0) AS week_duration,
       YEARWEEK(FROM_UNIXTIME(up.date)) AS yearweek
FROM (SELECT 1 as uid UNION ALL SELECT 2 UNION ALL SELECT 3) u LEFT JOIN
     cdu_user_progress up
     ON up.uid = u.uid
GROUP BY uid, YEARWEEK(FROM_UNIXTIME(up.date))
HAVING yearweek = 201411;
相关问题