![]() |
Модераторы: skyboy |
![]() ![]() ![]() |
|
whoever |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 85 Регистрация: 5.7.2007 Репутация: нет Всего: 1 |
Две таблицы:
panels (щиты): id, ... orders (заказы): panel_id, dt_start(DATETIME), dt_end(DATETIME), type(INT). Гарантируется, что для одной и той же записи dt_start <= dt_end. Type может быть 0 или 1. dt_start и dt_end - границы времени, на которые щит заказан. Входные данные: начала и концы временных отрезков int1_start-int1_end, int2_start-int2end, ... Нужно написать запрос для mysql 5, который бы выбирал щиты и _все_ соответствующие заказы для этого щита с условием, что временные интервалы из входных данных не будут пересекаться с интервалом dt_start-dt_end ни одного из заказов для данного щита, у которых type=0 (т.е., нужно выбрать щиты (и заказы к ним), для которых нет заказов на входные интервалы). Прошу помощи. |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 41 Всего: 260 |
|
|||
|
||||
whoever |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 85 Регистрация: 5.7.2007 Репутация: нет Всего: 1 |
Этот запрос вернет список panel_id. Чтобы получить затем все заказы к щитам из этого списка, использую запрос:
Насколько это будет накладно и нет ли способа быстрее? |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 41 Всего: 260 |
||||
|
||||
whoever |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 85 Регистрация: 5.7.2007 Репутация: нет Всего: 1 |
Есть список рекламных щитов. Клиенту нужно показать щиты, которые свободны в выбранные месяцы, и его состояния (занят/не занят, которые определяю по наличию заказа) на 18 месяцев подряд. Именно для этого нужны не только щиты, но и заказы.
И, конечно, спасибо большое за помощь ^_^ |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 41 Всего: 260 |
||||
|
||||
whoever |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 85 Регистрация: 5.7.2007 Репутация: нет Всего: 1 |
В частном случае - да. Но система строится так, что допускается возможность аренды на любой срок. Да и из эстетических соображений хочется построить именно так :)
Что же там насчет второй части вопроса? |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 41 Всего: 260 |
нет. сдаюсь. :(
вариант со временной таблицей, как мне кажется, неоправданно много данных будет перебрасывать; INNER JOIN на подзапрос будет едва ли быстрее, чем IN... наверное, можно так и оставить. Хотя для "красоты" можно и использовать INNУК JOIN там, где используется IN. Возможно, при повышенных требования к скорости выборки, я бы параллельно работал с таблицей "незанятые временные интервалы", которую бы обрабатывал параллельно со вставкой нового заказа в orders - это увелчило бы время вставки новых записей и модификации, но сократило бы время выборки "щитов, свободных в указанное время" и "заказов а щиты, которые свободны в указанное время". Потому как индексы на реальную таблицу, вместо группировки по подзапросу ![]() |
|||
|
||||
whoever |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 85 Регистрация: 5.7.2007 Репутация: нет Всего: 1 |
А разве при использовании таблицы незанятых временных интервалов нам не придется так же искать пересечения с той разницей, что теперь нужно будет искать не исключающее пересечение, а включающее?
|
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 41 Всего: 260 |
whoever, да. заметь: без UNION и группировки с подсчетом количества. всего лишь один запрос с одним параметром WHERE: BETWEEN ... AND ... Да, и сделать потом JOIN будет просто(и быстро - будут использоваться индексы на panel_id)
|
|||
|
||||
whoever |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 85 Регистрация: 5.7.2007 Репутация: нет Всего: 1 |
Спасибо
![]() |
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | MySQL | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |