2

我正在尝试创建一个查询,该查询将检查过去 7 天我的数据库中有多少条目,它可以工作,但它只返回记录存在的日期。我希望它在没有数据的日子里返回 0,因为我正在生成一份 7 天的报告。

任何帮助都感激不尽!

SELECT DATE(created_date) AS date, 
    (SELECT COUNT(id) 
    FROM records 
    WHERE DATE(created_date) = date AND method = 'tw') AS total_records 
FROM records 
WHERE created_date > DATE_SUB(NOW(), INTERVAL 7 day) 
GROUP BY date
4

4 回答 4

2
SELECT DATE(NOW() + INTERVAL num.i DAY) AS date, 
       COUNT(r.id) AS total_records 
FROM 
        ( SELECT 0 AS i UNION ALL               -- where 0 means today
          SELECT -1 UNION ALL                   -- and -1 is yesterday
          ...
          SELECT -6
        ) AS num
    LEFT JOIN
        records AS r
            ON  r.created_date >= DATE(NOW() + INTERVAL num.i DAY)
            AND r.created_date < DATE(NOW() + INTERVAL 1+num.i DAY)
            AND r.method = 'tw'
GROUP BY num.i ;

上的索引(method, created_date)将有助于提高效率。

于 2012-10-08T13:16:57.663 回答
1
SELECT case when created_date is null
            then 0
            else DATE(created_date)
       end AS date,
      (SELECT COUNT(id)
       FROM records
       WHERE DATE(created_date) = date 
       AND method = 'tw') AS total_records 
FROM records
WHERE created_date > DATE_SUB(NOW(), INTERVAL 7 day)
OR created_date is null
GROUP BY date
于 2012-10-08T13:02:16.043 回答
1

我怀疑将子查询从SELECT子句移动到FROM子句会提高性能。但是,如果您只想计算 tw 记录,则根本不需要子查询:

SELECT date(created_date) as date, 
       sum(case when method = 'tw' then 1 else 0 end) as total_records
FROM records 
WHERE created_date > DATE_SUB(NOW(), INTERVAL 7 day)
group by date(created_date)

这将每天返回,假设每天至少有一种类型的记录。顺便说一句,如果您对created_dateNULL 有疑问,那么您可以包括 Juergen 建议的条件。

于 2012-10-08T13:25:08.903 回答
1

性能取决于您在 7 天的时间间隔内将拥有多少条记录。

select date, 
       sum(cnt) 
from (SELECT 
       count(id) as cnt, 
       date(created_date) as date
       FROM records 
      WHERE created_date > DATE_SUB(NOW(), INTERVAL 7 day)
            and method ='tw' 
            and created_date < now()
      group by date
      union all (select 0 as cnt, date(DATE_SUB(NOW(), INTERVAL 6 day)) as date)
      union all (select 0 as cnt, date(DATE_SUB(NOW(), INTERVAL 5 day)) as date)
      union all (select 0 as cnt, date(DATE_SUB(NOW(), INTERVAL 4 day)) as date)
      union all (select 0 as cnt, date(DATE_SUB(NOW(), INTERVAL 3 day)) as date)
      union all (select 0 as cnt, date(DATE_SUB(NOW(), INTERVAL 2 day)) as date)
      union all (select 0 as cnt, date(DATE_SUB(NOW(), INTERVAL 1 day)) as date)
      union all (select 0 as cnt, date(NOW()) as date)
     ) t

group by date
于 2012-10-08T14:07:46.757 回答