Мой sql-запрос для данных за последние 7 дней? если данных нет, тогда даже выбирают дату и показывают с 0 или нулем
Я сделал одну демонстрацию Enity в SQL Fidldle. моя таблица имеет следующий столбец
displayId | displaytime | campaignId
Теперь я хочу выбрать запись за последние 7 дней для конкретного идентификатора кампании (я имею в виду, где идентификатор кампании ="") должна быть несколько записей на одну и ту же дату с тем же идентификатором кампании... поэтому я хочу показать сумму общего идентификатора кампании с их дата
так что если есть 7 записей на дату 2013-3-8 и другую дату, то это показывает мне запись как
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... например, то, что я пробовал, выглядит следующим образом... но это просто дает мне одну запись, которая имеет запись в базе данных...
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
я реализовал часовой пояс в моем запросе, так что если вы можете помочь мне с простым запросом, то его нормально... не включать Convert_Tz
линия.
это http://sqlfiddle.com/ ссылка моего фиктивного права
1 ответ
Если вы используете таблицу дат, ваш запрос может быть таким простым:
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
Без использования таблицы дат, вот один из способов. Это уродливо и, вероятно, ужасно для производительности:
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
Просто! Вы можете сделать это с помощью PHP. Сначала создайте массив дат, например
date = date('Y-m-d'); $date1 = date('Y-m-d', strtotime('-1 days')); $date2 = date('Y-m-d', strtotime('-2 days'));$date3 = date('Y-m-d', strtotime('-3 days'));$date4 = date('Y-m-d', strtotime('-4 days'));$date5 = date('Y-m-d', strtotime('-5 days'));$date6 = date('Y-m-d', strtotime('-6 days'));
$dt_arr = array($date6,$date5,$date4,$date3,$date2,$date1,$date);
за последние 7 дней с сегодняшнего дня, затем используйте foreach и запустите запрос с полем даты внутри foreach, например
foreach ($dt_arr as $value)
{
$qry = mysqli_fetch_array(mysqli_query($link,"select * from table where dt_field = $value"));
if($qry['value'] == '')
{
$valfield = 0;
$dtfiled = $value;
}