2010-09-15 2 views
1

У меня есть этот запрос для подсчета «просмотров» в таблице по дате. Очевидно, это дает мне только даты, когда была активность, но я бы хотел, чтобы MySQL возвращал данные за выбранный период времени. Например, 30 строк в течение 30-дневного периода, создавая нулевые данные для дат, в которых нет соответствующих строк.MYSQL: подсчет записей в таблице «событие», группировка по дате и количеству строк - на период даты

Я хочу избежать использования PHP, чтобы понять это, поэтому я подумал, что попрошу здесь дать совет о том, как, возможно, выполнить это с помощью интеллектуального запроса.

QUERY:

SELECT count(ID) AS views, date AS view_date 
FROM logging.views 
WHERE date < DATE_SUB(NOW(),INTERVAL 30 DAY) 
GROUP BY DAY(date)"; 

Пример ниже только дает мне 7 строк, очевидно, потому что есть только запись, соответствующая 7 разных дней в промежутке выбран 30 дня. Я хотел бы получить 30 строк, представляющих все дни в заданном интервале.

ВЫВОД:

Array 
(
    [0] => Array 
     (
      [date] => 2010-09-01 22:04:19 
      [views] => 20 
     ) 

    [1] => Array 
     (
      [date] => 2010-08-13 00:15:54 
      [views] => 4 
     ) 

    [2] => Array 
     (
      [date] => 2010-08-24 17:46:53 
      [views] => 2 
     ) 

    [3] => Array 
     (
      [date] => 2010-08-25 07:18:11 
      [views] => 35 
     ) 

    [4] => Array 
     (
      [date] => 2010-08-26 08:02:47 
      [views] => 12 
     ) 

    [5] => Array 
     (
      [date] => 2010-08-27 09:56:05 
      [views] => 29 
     ) 

    [6] => Array 
     (
      [date] => 2010-08-28 12:46:17 
      [views] => 30 
     ) 

) 

ответ

1

Общее решение для этого в SQL является создание временной таблицы с этих 30 дней, и LEFT OUTER JOIN его к вашему views таблице.

SELECT COUNT(v.ID) AS views, d.date AS view_date 
FROM logging.alldays d 
LEFT OUTER JOIN logging.views v ON d.date = v.date 
WHERE d.date < DATE_SUB(NOW(),INTERVAL 30 DAY) 
GROUP BY d.date 

Или сделать не-временную таблицу и предварительно заполнить его во все дни в течение следующих 100 лет. Это всего 36525 строк, что легко для РСУБД.


Но что, если бы я хотел, чтобы запросить в час или минуту?

Тогда, вероятно, подход временного стола был бы проще.

В принципе, SQL хорош в соединении наборов данных с другими наборами данных - не присоединяя данные к тонкому воздуху. Поэтому вам нужно сделать набор данных где-то, чтобы присоединиться к нему.

Некоторые марки базы данных SQL имеют встроенные функции для создания эфемерного набора данных, представляющего некоторый полезный диапазон значений. Например, PostgreSQL имеет generate_series(). К сожалению, MySQL не предлагает эту функцию.

+0

Большой совет. Но что, если бы я хотел запросить час или минуту? Я полагаю, что таблица non-temp была бы большой для 36525 * 60 * 60 строк? – dropson

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