SQL-вызов для возврата по дням месяца с многодневными элементами

Я пытаюсь сконденсировать несколько вызовов SQL в один и хотел узнать, возможны ли следующие.

Вот мои таблицы.

Organization
    id

Event
    id,
    startDate
    endDate

FavoriteOrgs
    userId
    orgId

В каждый день месяца я хочу вернуть счет событий, происходящих в этот день. Не слишком сложно, пока вы не добавите тот факт, что события могут охватывать 2 или 3 дня .

Вот что у меня есть до сих пор, что точно показывает количество событий в день, но оно включает только событие в счете за день его начала.

SELECT DAYOFMONTH( CAST( o.start_date AS DATE ) ) AS dayNum, COUNT( * ) AS count
    FROM favoriteOrgs f, event e, organization o
    WHERE f.user_id =200372
    AND e.profile_id = o.id AND e.profile_id = f.profile_id AND o.id = f.profile_id
    AND e.last_date >=  '$startDate'
    AND e.start_date <=  '$lastDate'
    GROUP BY e.start_date
2
Можете ли вы опубликовать свою схему
добавлено автор hafichuk, источник
Это не схема. Я не знаю, что это. В вашем клиенте MySQL запустите «DESC organization» и т. Д. См. dev.mysql .com/DOC/RefMan/5.0/ен/describe.html .
добавлено автор hafichuk, источник
Я разместил его в вопросе, но здесь он снова: организация (id); event (id, startDate, endDate); favoriteOrgs (userId, orgId)
добавлено автор Jeremy Penrod, источник
Ах. Идентификаторы - это ints. startDate и endDate являются отметками времени.
добавлено автор Jeremy Penrod, источник

1 ответы

Ваша модель данных фактически не моделирует все объекты в вашей системе. Одно лицо - это даты, на которые вы заинтересованы сообщать о вещах.

Вы должны добавить таблицу в свою базу данных (или использовать временную таблицу, встроенную таблицу или что-то еще, что доступно в MySQL). Таблица - это просто все соответствующие даты. Даже таблица, которая восходит к 1900 году и до 2100 года, будет довольно маленькой.

Затем запрос становится тривиальным:

CREATE TABLE Calendar (
    calendar_date DATE NOT NULL,
    CONSTRAINT PK_Calendar PRIMARY KEY CLUSTERED
)

SELECT
    C.calendar_date,
    COUNT(*) AS count
FROM
    favoriteOrgs F
INNER JOIN Event E ON
    E.profile_id = F.profile_id AND
    E.last_date >= '$startDate' AND
    E.start_date <= '$lastDate'
INNER JOIN Organization O ON
    O.id = F.profile_id AND
    O.id = E.profile_id
WHERE
    F.user_id = 200372
GROUP BY
    C.calendar_date

Теперь у вас также есть преимущество, что вы можете добавить дополнительную информацию о конкретном бизнесе в календарные даты, например столбец «is_holiday», «economic_quarter» или что-то еще. Просто не забудьте заполнить таблицу, которая представляет собой простой цикл, который нужно запустить один раз.

3
добавлено
Если вы хотите, чтобы это было разбито днем, я не думаю, что код какой-либо другой. Я человек MS SQL, хотя и у них есть отвратительный тип данных TIMESTAMP, поэтому я не уверен, как его обрабатывает MySQL. Если вы хотите, чтобы он разбился по часам или что-то, вы можете просто JOIN в сгенерированном наборе чисел от 1 до 24 и ведро на основе тех, которые вместе с датами. Ключевым моментом является выбор вашего набора ведер как самого набора данных.
добавлено автор Tom H, источник
Вау. Отличный ответ, спасибо. Простите мою неопытность здесь, но в настоящее время столбцы «startDate» и «endDate» таблицы «возможность» - это отметки времени - поскольку возможности имеют время начала и окончания, а также даты. Есть ли способ использовать это решение со временными метками?
добавлено автор Jeremy Penrod, источник
DBA - русскоговорящее сообщество
DBA - русскоговорящее сообщество
1 345 участник(ов)

Общаемся и обсуждаем темы, посвященные DBA, PostgreSQL, Redis, MongoDB, MySQL, neo4j, riak и т.д. См. также: @devops_ru, @kubernetes_ru, @docker_ru, @nodejs_ru Рекомендуем сразу отключить уведомления, чтобы пребывание здесь было полезным и комфортным.

MySQL
MySQL
995 участник(ов)

The group is about MySQL. For code use hastebin.com. Admin: @smlkw

SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)