2016-04-02 4 views
1

У меня возникла ситуация, когда мне нужно захватить данные за последние 30 дней и получить все даты, даже если эти данные отсутствуют в mysql для данных дат.Как выбрать последние 30 дней в MySQL, даже даты нет в mysql?

Мой текущий запрос - это что-то вроде этого. LastUpdated столбец временной метки

SELECT Date(a.lastUpdated), count(*) 
FROM table1 a 
LEFT JOIN table2 b on (a.pgid = b.prod_id) 
WHERE Date(lastUpdated) BETWEEN CURDATE() - INTERVAL 30 DAY AND CURDATE() 
GROUP BY Date(a.lastUpdated); 

Это возвращаемый результат как этот

Date(a.lastUpdated) count(*) 
2016-03-23    1 
2016-03-24    14 
2016-03-30    65 
2016-03-31    1 
2016-04-02    1 

Мой вопрос, если его можно перечислить все даты, даже если данные не в MySQL. Или любое другое обходное решение. Я использую PHP 7.0.

Я огляделся вокруг, но не нашел ничего, что связано с моими требованиями.

+0

нет простого способа ИМХО. Вы можете найти этот полезный, хотя и не имеющий прямого отношения: http://stackoverflow.com/questions/1046865/mysql-select-all-dates-in-a-range-even-if-no-records-present – Gogol

+0

, если ваш данные не имеют информации, которая может использоваться для выбора и фильтрации, тогда у нее нет информации, которая может быть использована для выбора и фильтрации. Представьте, что вы ничего не знаете о том, что данные * о *, и вас попросили вручную просмотреть его и найти записи за последние 30 дней. Вы находите запись без даты. Чем ты занимаешься? Если ваш инструктор не расскажет вам, как лечить беспилотные записи, вам придется их игнорировать. То же самое - либо сказать, что должно произойти, либо SQL игнорирует их. –

+1

Определить 'данные нет в mysql' –

ответ

1

Предполагая упрощенный пример таблицы table1 со следующим содержимым

CREATE TABLE table1 (lastUpdated datetime); 
INSERT INTO table1 (lastUpdated) VALUES ('2016-03-23'); 
INSERT INTO table1 (lastUpdated) VALUES ('2016-03-24'); 
INSERT INTO table1 (lastUpdated) VALUES ('2016-03-30'); 
INSERT INTO table1 (lastUpdated) VALUES ('2016-03-31'); 
INSERT INTO table1 (lastUpdated) VALUES ('2016-04-02'); 
INSERT INTO table1 (lastUpdated) VALUES ('2016-03-31'); 

Тогда следующая инструкция MySQL возвращает все даты в течение последних 30 дней, с отсчетом от 0, где запись не найдена в table1:

SELECT lastUpdated, count(*)-1 FROM (
    SELECT date(lastUpdated) as lastUpdated FROM table1 as t1 
    UNION ALL 
    SELECT curdate() - interval a day AS lastUpdated FROM (
     select 0 as a union select 1 union select 2 union select 3 union 
     select 4 union select 5 union select 6 union select 7 union 
     select 8 union select 9 union select 10 union select 11 union 
     select 12 union select 13 union select 14 union select 15 union 
     select 16 union select 17 union select 18 union select 19 union 
     select 20 union select 21 union select 22 union select 23 union 
     select 24 union select 25 union select 26 union select 27 union 
     select 28 union select 29 
    ) as t2 
) as t3 GROUP BY lastUpdated; 
+1

Вы всегда можете использовать http://sqlfiddle.com/, который является онлайн-тестом для некоторых БД, включая MySQL :) – Prix

+0

@Prix Thanks много, и я уже использовал его, чтобы изменить ответ, который я знал о jsfiddle, но почему-то полностью упустил phpfiddle и sqlfiddle ... – Guido

+0

@Guido Спасибо. Я попробую это. Будет ли это работать лучше, если у меня будет тысячи строк. Просто хотел иметь лучший вариант. Держите его положительным. –

Смежные вопросы