2

過去7日間にデータベースにあるエントリの数を確認するクエリを作成しようとしていますが、機能しますが、レコードが存在する日付のみが返されます。7日間のレポートを作成しているため、データがない日には0を返したいと思います。

どんな助けもありがたく受けました!

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

パフォーマンスは、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 に答える
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と、パフォーマンスが向上すると思われます。ただし、2 つのレコードをカウントするだけの場合は、サブクエリはまったく必要ありません。

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)

毎日少なくとも 1 種類のレコードがあると仮定すると、これは毎日返されます。ちなみに、created_dateNULL であることに問題がある場合は、ユルゲンが提案した条件を含めることができます。

于 2012-10-08T13:25:08.903 に答える