1

SQL Fiddlele でデモ Enity を 1 つ作成しました。私のテーブルには次の列があります

displayId | displaytime | campaignId

今私が欲しいのは、特定のキャンペーン ID の過去 7 日間のエントリを選択することです (つまり、campaignId="") 同じキャンペーン ID を持つ同じ日付のエントリが複数あるはずです..したがって、合計のキャンペーン ID の合計を表示したい彼らの日付

したがって、日付 ​​2013-3-8 と他の日付の 7 つのレコードがある場合、次のようなレコードが表示されます

2013-03-02 | 1
2013-03-03 | 1
2013-03-04 | 0
2013-03-05 | 0
2013-03-06 | 0
2013-03-07 | 2
2013-03-08 | 7

次のクエリでは、カウントが0を超えるカウントの日付を表示するだけです...たとえば、私が試したのは次のとおりです..しかし、データベースにエントリがあるレコードが1つだけ表示されます...

 2013-03-08 | 7


SELECT date(a.displayTime) AS `DisplayTime`,
       ifnull(l.TCount,0) AS TCount
FROM a_ad_display AS a
INNER JOIN
  (SELECT count(campaignId) AS TCount,
          displayTime
   FROM a_ad_display
   WHERE CONVERT_TZ(displaytime,'+00:00','-11:00') >= DATE_SUB(CONVERT_TZ(CURDATE(),'+00:00','-11:00') ,INTERVAL 1 DAY)
     AND CONVERT_TZ(displaytime,'+00:00','-11:00') <= CONVERT_TZ(CURDATE(),'+00:00','-11:00')
     AND campaignId = 20747
   GROUP BY DATE(displayTime)) AS l ON date(a.displayTime) = date(l.displayTime)
GROUP BY DATE(a.displayTime)
ORDER BY a.displaytime DESC LIMIT 7

クエリにタイムゾーンを実装したので、単純なクエリで私を助けることができれば、OK..Convert_Tz行を含めないでください。

これは私のダミーエンティティのhttp://sqlfiddle.com/#!2/96600c/1リンクです

4

2 に答える 2

4

日付テーブルを使用する場合、クエリは次のように単純になります。

select dates.fulldate, count(a_ad_display.id)
from dates
left outer join a_ad_display ON dates.fulldate = a_ad_display.displaytime
    [AND <other conditions here>]
where dates.fulldate BETWEEN date_add(curdate(), interval -6 day) AND curdate()
group by dates.fulldate

http://sqlfiddle.com/#!2/51e17/3


日付テーブルを使用しない場合の 1 つの方法を次に示します。それは醜く、パフォーマンスにとっておそらくひどいものです:

select displaytime, sum(c)
from
(
  select displaytime, count(a_ad_display.id) AS c
  from a_ad_display
  where displaytime BETWEEN date_add(curdate(), interval -6 day) AND curdate()
  group by displaytime
  union all
  select curdate(), 0
  union all
  select date_add(curdate(), interval -1 day), 0
  union all
  select date_add(curdate(), interval -2 day), 0
  union all
  select date_add(curdate(), interval -3 day), 0
  union all
  select date_add(curdate(), interval -4 day), 0
  union all
  select date_add(curdate(), interval -5 day), 0
  union all
  select date_add(curdate(), interval -6 day), 0
) x
group by displaytime
order by displaytime

http://sqlfiddle.com/#!2/96600c/16

于 2013-03-08T08:16:27.407 に答える