我如何使用mysql计算过去31天的数量?

时间:2012-11-17 14:51:21

标签: mysql sql gaps-and-islands

  

可能重复:
  MySQL how to fill missing dates in range?

我有一个包含以下列的表:

  • id
  • submitdate
  • clicks

现在我想从31天内检索每天的点击次数。

如果特定日期没有记录,则该值应为零。

1 个答案:

答案 0 :(得分:1)

试试这个:

SELECT 
  DATE(submitdate) 'Day',
  SUM(clicks)
FROM Table
WHERE DATEDIFF(NOW(), submitdate) <= 31
GROUP BY DATE(submitdate);

SQL Fiddle Demo

<击>

更新:为此,您需要生成当前日期NOW()的最后n天的列表。我用这个锚表:

CREATE TABLE TEMP 
(Digit int);
INSERT INTO Temp VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9);

然后我用它来生成从现在开始的最近n天的列表(在演示中我使用了31天,但你可以尝试使用任何小于100的值,如果你想获得超过100天,你将需要CROSS JOIN temp表再一次)我使用了以下查询:

    SELECT 
      DATE_SUB(NOW(), INTERVAL id DAY) GDay
    FROM
    (
      SELECT t2.digit * 10 + t1.digit + 1 AS id
      FROM         TEMP AS t1
      CROSS JOIN TEMP AS t2
    ) t WHERE id <= 31;

然后使用LEFT JOIN,您可以获得最近31天,如果没有记录,则会有0代替:

SELECT
  DATE(t2.GDay) 'Day', 
  SUM(IFNULL(t1.clicks, 0)) 'Count of clicks'
FROM
(
    SELECT 
      DATE_SUB(NOW(), INTERVAL id DAY) GDay
    FROM
    (
      SELECT t2.digit * 10 + t1.digit + 1 AS id
      FROM         TEMP AS t1
      CROSS JOIN TEMP AS t2
    ) t WHERE id <= 31
) t2 
LEFT JOIN Table1 t1 ON DATE(t1.submitdate) = DATE(t2.GDay)
GROUP BY DATE(t2.GDay)
ORDER BY DAY DESC;

SQL Fiddle Demo