我试图总结一个特定用户在过去7天(实际的一天是第7天)每天活动的卡路里。有表user和activities以及Map表user\u activities。
以下示例适用于id=1的用户;
总结过去7天每天的卡路里(这一天是第7天)*/
SELECT
DATE(a.end_time), SUM(a.calories)
FROM
activities a
JOIN
user_activities uc ON uc.activity_id = a.id
WHERE
uc.user_id = 1
AND DATE(a.end_time) >= CURRENT_DATE - INTERVAL 6 DAY
GROUP BY
DATE(a.end_time) DESC
该查询返回以下结果集:
2018-12-28 9600
2018-12-27 1200
2018-12-26 1200
2018-12-25 1200
2018-12-24 4800
2018-12-22 1200
这是正确的,但现在我的问题是,正如你在列表中看到的,2018年12月23日没有列出,因为这一天没有活动。现在我要展示
2018-12-23 0
而不是什么都没有。
我怎样才能得到想要的结果?
谢谢你的帮助
我也尝试了ifnull和coalesce,但到目前为止没有运气
总结过去7天每天的卡路里(这一天是第7天)*/
SELECT
DATE(a.end_time), SUM(a.calories)
FROM
activities a
JOIN
user_activities uc ON uc.activity_id = a.id
WHERE
uc.user_id = 1
AND DATE(a.end_time) >= CURRENT_DATE - INTERVAL 6 DAY
GROUP BY
DATE(a.end_time) DESC
结果:
2018-12-28 9600
2018-12-27 1200
2018-12-26 1200
2018-12-25 1200
2018-12-24 4800
2018-12-22 1200
预期结果:
2018-12-28 9600
2018-12-27 1200
2018-12-26 1200
2018-12-25 1200
2018-12-24 4800
2018-12-23 0
2018-12-22 1200
``` `Activities` 表格:
![](https://i.stack.imgur.com/gfrtR.png)
4条答案
按热度按时间yks3o0rb1#
如果你的活动表中没有列出某一天的活动,那么fa06的诀窍就行不通了。一个简单的方法是在求和之前,在上面添加一些零记录:
fa06的方法依赖于activities表中每天有一条记录。这是解决问题的一种有效方法,但您尚未明确这些表包含哪些数据(提示:发布db问题时,请务必包含每个表中的示例数据)
使用这种方法,我们可以正常地进行查找,但我们也会生成7个伪行,其中包含过去7天的日期和0卡路里的计数。加上真正的卡路里,这些是无脂肪的;)当没有某一天的数据时,这些单独提供0
如果需要更多的天数,可以考虑使用行生成模式。mysql不像其他数据库那样有行生成器,但最简单的技巧是创建变量,用0初始化它,然后递增,并在从至少有30行的表返回的每一行上使用它:
这背后的理论是:表至少有30行,@row变量被初始化为-1,并且存在于整个会话范围内用于查询。当行被拉出并返回时,@row被递增然后返回(所以它是0,1,2..)这个递增的计数用来减去当前数据的0,1,2等天,给我们一个过去30天的日期序列
请注意,我无法测试这两个查询中的任何一个;第二个可能有一些小的语法错误。如果结果不起作用,并且错误是不寻常的/您无法修复的东西,请告诉我。
调试:
单独运行每个查询。我不知道这会产生多少行:
这个应该有30行。如果没有,那是因为您没有使用至少有30行的表:
编辑:
修复了此错误-在联合后应用限制;这会产生不期望的结果
knsnq2tg2#
你可以试试下面-使用左连接
ncecgwcz3#
我试了一下,刚刚更新了
SUM(a.calories)
至IF(SUM(a.calories) IS NULL, 0, SUM(a.calories))
你可以试试。。。w8rqjzmb4#
此查询应符合以下要求:
cte动态地生成一个日期范围(这将上升到大约300年前)
结果是
LEFT JOIN
我被那个activities
以及user_activities
table这个
COALESCE
函数变为空SUM
进入0
价值观查询: