【问题标题】:mysql date list with count even if no data on specific date [duplicate]即使特定日期没有数据,mysql日期列表也有计数[重复]
【发布时间】:2012-09-27 11:41:24
【问题描述】:

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

我正在尝试从 mysqldata 制作图表,

Postid | date       | text
1      | 2012-01-01 | bla
2      | 2012-01-01 | bla
3      | 2012-01-02 | bla
4      | 2012-01-02 | bla
5      | 2012-01-04 | bla
6      | 2012-01-04 | bla
7      | 2012-01-05 | bla

现在,我想获取每天的帖子数,包括零的日期。例如,我希望能够像这样获得第一周:

date       | count(Postid)
2012-01-01 | 2
2012-01-02 | 2
2012-01-03 | 0
2012-01-04 | 2
2012-01-05 | 1
2012-01-06 | 0
2012-01-07 | 0

我正在寻找一个通用的解决方案,我不必指定每个日期。有什么建议吗?

【问题讨论】:

  • 在 mysql 中生成行非常困难,没有任意大小的表(所以我猜你可以),使用 rownum = rownum + 1 技巧)。如果您需要在数据库端执行此操作,我建议您创建一个包含合适日期范围的表来进行外部连接,以便获取您需要的数据。 PostgreSQL 具有涵盖行生成的函数“generate_series”,如果没有另一个表,这将非常容易。
  • THIS ARTICLE (click here) 可以指导您解决问题。

标签: mysql database gaps-and-islands


【解决方案1】:

假设你的postids 在你的表中是连续的,那么这个查询:

SELECT
  DATE_FORMAT(b.date, '%Y-%m-%d') date,
  COUNT(c.postid)
FROM
(
  SELECT
    (SELECT MAX(date) FROM ex) + INTERVAL 3 DAY - INTERVAL a.postid DAY AS date
  FROM
    ex a
) b
LEFT JOIN
  ex c ON c.date = b.date
GROUP BY
  b.date
ORDER BY
  b.date

产生:

date    COUNT(c.postid)
2012-01-01  2
2012-01-02  2
2012-01-03  0
2012-01-04  2
2012-01-05  1
2012-01-06  0
2012-01-07  0

http://sqlfiddle.com/#!2/2cf8d/2

如果您的postids 不连续,那么您可以使用ids 连续ID 表:

SELECT
  DATE_FORMAT(b.date, '%Y-%m-%d') date,
  COUNT(c.postid)
FROM
(
  SELECT
    (SELECT MAX(date) FROM ex) + INTERVAL 3 DAY - INTERVAL a.id DAY AS date
  FROM
    ids a
) b
LEFT JOIN
  ex c ON c.date = b.date
GROUP BY
  b.date
ORDER BY
  b.date DESC
LIMIT 7

http://sqlfiddle.com/#!2/13035/1

【讨论】:

    【解决方案2】:

    在 MySQL 中,我建议创建一个列出日期的日历表。然后你将加入那张桌子。类似这样:

    CREATE TABLE Table1(`Postid` int, `date` datetime, `text` varchar(3));
    
    INSERT INTO Table1(`Postid`, `date`, `text`)
    VALUES
        (1, '2011-12-31 17:00:00', 'bla'),
        (2, '2011-12-31 17:00:00', 'bla'),
        (3, '2012-01-01 17:00:00', 'bla'),
        (4, '2012-01-01 17:00:00', 'bla'),
        (5, '2012-01-03 17:00:00', 'bla'),
        (6, '2012-01-03 17:00:00', 'bla'),
        (7, '2012-01-04 17:00:00', 'bla');
    
    CREATE TABLE Table2(`date` datetime);
    
    INSERT INTO Table2(`date`)
    VALUES('2011-12-31 17:00:00'),
        ('2012-01-01 17:00:00'),
        ('2012-01-02 17:00:00'),
        ('2012-01-03 17:00:00'),
        ('2012-01-04 17:00:00'),
        ('2012-01-05 17:00:00'),
        ('2012-01-06 17:00:00'),
        ('2012-01-07 17:00:00'),
        ('2012-01-08 17:00:00');
    
    select t2.date, count(postid)
    from table2 t2
    left join table1 t1
      on t2.date = t1.date
    group by t2.date
    

    SQL Fiddle with Demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-22
      • 1970-01-01
      • 2014-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多