在MySQL中按周分组

时间:2013-08-17 11:47:38

标签: php mysql sql join

表结构是,

Table name: btq_user

name, email, kall, state_id, datain

现在我想计算每周在(51,20,46)中有kall = 1或state_id的数字记录。 无论年份如何变化,我都需要每周(周一至周日)的结果。比方说,例如31-12-2012是星期一,6-1-2013是星期日,所以结果应该包括一周。无论年度变化,它都应该只计算数周。

这是我尝试但不工作的。

SELECT 
count( if( A.state_id = 51 or A.state_id = 20 or A.state_id = 46, A.state_id,
null  ) ) AS state_total, count( if( A.kall =1, A.kall, null ) ) AS appointment, 
CONCAT( WEEK( A.datain) , " - 
", YEAR( A.datain ) ) AS week
FROM btq_user A
GROUP BY week
ORDER BY A.datain ASC

是否有可能显示周(31-12-2012 - 6-1-2013)的结果?

感谢您阅读我的问题。

1 个答案:

答案 0 :(得分:2)

这两步:

其中一个,您需要进行一周截断操作 - 这会占用您的DATETIME项目并在前一个星期日的午夜返回(如果您的业务规则表明该周从星期日开始)。

这成为合适的GROUP BY项目。 WEEK()/ YEAR()hack不适用于此。它确实在每年的最后一周/第一周弄得一团糟。

根据我的经验,这个表情将为你做周截断技巧,周日 - 周六,

  FROM_DAYS(TO_DAYS(TIMESTAMP) -MOD(TO_DAYS(TIMESTAMP) -1, 7))

要获得周一至周日周,请使用此表达式。

  FROM_DAYS(TO_DAYS(TIMESTAMP) -MOD(TO_DAYS(TIMESTAMP) -2, 7))

所以你可以这样做。

  SELECT COUNT(whatever), SUM(whatelse),
         FROM_DAYS(TO_DAYS(event_time) -MOD(TO_DAYS(event_time) -1, 7)) as WEEKSTART,
    FROM TABLE
   GROUP BY FROM_DAYS(TO_DAYS(event_time) -MOD(TO_DAYS(event_time) -1, 7))

How to group by week in MySQL?

其次,您需要在截短日期中添加六天,这样您就可以显示每周的最后一天以及第一天。

使用嵌套查询

这是一种很好的方法
SELECT whats, elses, weekstart, weekstart + INTERVAL 6 DAY AS weekend
  FROM (
  SELECT COUNT(whatever) AS whats, SUM(whatelse) AS elses,
         FROM_DAYS(TO_DAYS(event_time) -MOD(TO_DAYS(event_time) -1, 7)) AS weekstart,
    FROM TABLE
   GROUP BY FROM_DAYS(TO_DAYS(event_time) -MOD(TO_DAYS(event_time) -1, 7))
  ) AS summary
ORDER BY weekstart

做很多这个?我建议你创建一个存储的TRUNC_WEEK函数。