【问题标题】:Get week over week data获取每周数据
【发布时间】:2015-12-04 19:24:23
【问题描述】:

我有一张如下表

CREATE TABLE messages  ( 
id          int(10) UNSIGNED AUTO_INCREMENT NOT NULL,
messagetext text NOT NULL,
created_at  timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY(id)

)

我想做的是获取两周的数据,即本周和前一周,按天排序。例如,本周和上周在周日、周一、周二、周三...创建了多少条消息。

我确实有如下查询

SELECT
    COUNT(id) AS 'Count' 
FROM
    'messages'
WHERE
    (WEEK(created_at) = WEEK(NOW())) 
GROUP BY
    WEEKDAY(created_at) 
ORDER BY
    week(created_at) ASC,
    weekday(created_at) ASC

但我不知道如何按天排序。例如,上面的查询将列出我今天或昨天得到了多少,但这不是我想要的。我想要的是按天和按周计算。

这是我想要的

如果我对我所面临的情况足够清楚,请告诉我。

更新: 更多信息,请看下面胡安的问题

如果当前天数少于 14 天,在这种情况下,脚本应该返回前一周的天数,而不是前一周的前一周。这是胡安的解释(想象今天是星期五。如果你倒数 14 天,你会得到这周的周一到周五。前一周的周一到周日......以及上一周的周五到周日。不确定这是否是你的结果想要)

问候

加根

【问题讨论】:

标签: mysql sql


【解决方案1】:

使用条件SUM

SELECT week(created_at) week_id,
       SUM( IF(weekday(created_at) = 0, 1, 0) ) as monday,
       SUM( IF(weekday(created_at) = 1, 1, 0) ) as tuesday,
       SUM( IF(weekday(created_at) = 2, 1, 0) ) as wednesday,
       SUM( IF(weekday(created_at) = 3, 1, 0) ) as thursday,
       SUM( IF(weekday(created_at) = 4, 1, 0) ) as friday,
       SUM( IF(weekday(created_at) = 5, 1, 0) ) as saturday,
       SUM( IF(weekday(created_at) = 6, 1, 0) ) as sunday
FROM  'messages'
WHERE created_at >= DATE_SUB(NOW(), INTERVAL 14 DAY)
  AND (      week_id = WEEK( NOW() ) 
         OR  week_id = WEEK( DATE_SUB(NOW(), INTERVAL 7 DAY) 
      )
GROUP BY
    week_id
ORDER BY
    week_id

【讨论】:

  • 我收到此错误:[MySQL][ODBC 5.3(w) Driver][mysqld-5.6.26-log]您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在 'weekday(created_at) = 0, 1, 0) as monday, SUM(IF weekday(created_at) = 1' at line 2 附近使用的正确语法
  • 遗漏了一些括号,再试一次
  • 可能需要一些调整才能在最后两周准确返回。但是使用weekday() 不会使用索引,这就是为什么我没有在第二个版本中使用它。同样在您的问题中,您没有指定如果您在 WED 中运行查询会发生什么。在这一期中,您将展示全部 14 天。但在三个不同的星期。
  • 是的,它确实有效.. 但我不确定你在之前的评论中说了什么。尤其是最后一部分..
  • 想象今天是星期五。如果你倒数 14 天,你会得到这个星期的星期一到星期五。前一周周一到周日......和前一周周五到周日。并且不确定这是否是您想要的结果
【解决方案2】:

我要发送一个很大的猜测。但是你尝试过这样的事情吗?

SELECT
    week(created_at) week_id,
    weekday(created_at) weekday_id,
    COUNT(id) AS 'Count' 
FROM
    'messages'
WHERE
      week_id = WEEK( NOW() ) 
  OR  week_id = WEEK( DATE_SUB(NOW(), INTERVAL 7 DAY) )
GROUP BY
    week_id, weekday_id 
ORDER BY
    week_id, weekday_id

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    • 2012-12-24
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    相关资源
    最近更新 更多