MySQL, чтобы получить количество строк, приходящихся на дату для каждого дня месяца - PullRequest
4 голосов
/ 22 мая 2009

У меня есть таблица, которая содержит список событий сообщества со столбцами для дней начала и окончания события. Если дата окончания равна 0, то событие происходит только в день начала. У меня есть запрос, который возвращает количество событий, происходящих в любой день:

SELECT COUNT(*) FROM p_community e WHERE 
    (TO_DAYS(e.date_ends)=0 AND DATE(e.date_starts)=DATE('2009-05-13')) OR
    (DATE('2009-05-13')>=DATE(e.date_starts) AND DATE('2009-05-13')<=DATE(e.date_ends))

Я просто добавляю любую дату, которую я хочу проверить на "2009-05-13".

Мне нужно иметь возможность получать эти данные за каждый день в течение всего месяца. Я мог бы просто выполнить запрос по каждому дню по одному, но я бы предпочел выполнить один запрос, который может дать мне весь месяц сразу У кого-нибудь есть предложения, как мне это сделать?

И нет, я не могу использовать хранимую процедуру.

Ответы [ 2 ]

9 голосов
/ 22 мая 2009

Попробуйте:

SELECT COUNT(*), DATE(date) FROM table WHERE DATE(dtCreatedAt) >= DATE('2009-03-01') AND DATE(dtCreatedAt) <= DATE('2009-03-10') GROUP BY DATE(date);

Получит сумму за каждый день мая 2009 года.

ОБНОВЛЕНО: теперь работает в диапазоне дат, охватывающих месяцы / годы.

6 голосов
/ 22 мая 2009

К сожалению, у MySQL нет способа генерировать набор строк с заданным количеством строк.

Вы можете создать вспомогательную таблицу:

CREATE TABLE t_day (day INT NOT NULL PRIMARY KEY)

INSERT
INTO    t_day (day)
VALUES  (1),
        (2),
        …,
        (31)

и используйте его в JOIN:

SELECT  day, COUNT(*)
FROM    t_day
JOIN    p_community e
ON      day BETWEEN DATE(e.start) AND IF(DATE(e.end), DATE(e.end), DATE(e.start))
GROUP BY
        day

Или вы можете использовать некрасивый подзапрос:

SELECT  day, COUNT(*)
FROM    (
        SELECT  1 AS day
        UNION ALL
        SELECT  2 AS day
        …
        UNION ALL
        SELECT  31 AS day
        ) t_day
JOIN    p_community e
ON      day BETWEEN DATE(e.start) AND IF(DATE(e.end), DATE(e.end), DATE(e.start))
GROUP BY
        day
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...