我有一个用户列表的结果表:
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的默认记录......
答案 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;