如何修复指定时间区间内uploads表Top3点赞量查询空列问题
问题:查询过去一周点赞量Top3返回空结果
需求是每周四结束时,从uploads表中获取过去一周点赞量Top3的数据,但当前执行SQL后返回空列。已知timestamp字段为YYYY-MM-DD HH:MM:SS格式的datetime类型。
当前使用的SQL代码:
select `users`.`name`, `uploads`.`likes`, `uploads`.`url`, `uploads`.`UserID`, `users`.`email`, `uploads`.`timestamp` from `uploads` inner join `users` on `users`.`UserID` = `uploads`.`UserID` where `uploads`.`timeStamp` >= curdate() - INTERVAL DAYOFWEEK(curdate()) +6 DAY and `uploads`.`timeStamp` < curdate() - INTERVAL DAYOFWEEK(curdate()) -1 DAY order by `likes` desc limit 3;
问题排查与修正
核心问题:时间区间逻辑错误,导致查询范围反向
你的SQL中时间条件的计算逻辑存在问题,MySQL中INTERVAL的运算优先级会让你的时间范围变成未来时间到过去时间,自然没有数据匹配:
- 以周四(
DAYOFWEEK(curdate())=5)为例,起始时间计算为curdate() - INTERVAL 5 DAY +6 DAY = curdate()+1 DAY(明天) - 结束时间计算为
curdate() - INTERVAL5 DAY -1 DAY = curdate()-6 DAY(6天前) - 这个区间是
明天 >= timestamp < 6天前,完全反向,不可能有数据。
修正后的SQL(适配每周四执行,统计过去一周数据)
因为你是每周四执行查询,要获取上周四00:00到本周四23:59的点赞Top3,调整时间条件即可:
select `users`.`name`, `uploads`.`likes`, `uploads`.`url`, `uploads`.`UserID`, `users`.`email`, `uploads`.`timestamp` from `uploads` inner join `users` on `users`.`UserID` = `uploads`.`UserID` -- 上周四00:00到本周四23:59 where `uploads`.`timestamp` >= DATE_SUB(curdate(), INTERVAL 7 DAY) and `uploads`.`timestamp` < DATE_ADD(curdate(), INTERVAL 1 DAY) order by `uploads`.`likes` desc limit 3;
额外注意事项
- 统一字段名大小写:原SQL中混用了
timeStamp和timestamp,如果你的数据库开启了大小写敏感配置,会导致字段匹配失败,建议统一写成uploads.timestamp(和实际字段名一致)。 - 若需要统计周一到周日的上周数据(而非周四到周四的周期),可以调整时间条件为:
-- 上周周一00:00到本周一00:00 where `uploads`.`timestamp` >= DATE_SUB(curdate(), INTERVAL WEEKDAY(curdate()) +7 DAY) and `uploads`.`timestamp` < DATE_SUB(curdate(), INTERVAL WEEKDAY(curdate()) DAY)
内容的提问来源于stack exchange,提问作者sp92
相关产品推荐
相关产品推荐

