Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запрос, связанный с исключением пересечения 
V
    Опции темы
whoever
Дата 30.1.2008, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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 (т.е., нужно выбрать щиты (и заказы к ним), для которых нет заказов на входные интервалы). 

Прошу помощи.
PM   Вверх
skyboy
Дата 30.1.2008, 14:56 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



Код

SELECT `panel_id`,sum(`counter`) as `total_counter`
FROM (
SELECT `o0`.`panel_id`,count(*) as `counter`
FROM `orders` `o0`
WHERE '2007-12-30 00:00:00.000' /*input interval: date of end*/  BETWEEN `o0`.`dt_start` AND `o0`.`dt_end`
GROUP BY `o0`.`panel_id`
UNION
SELECT `o1`.`panel_id`,count(*) as `counter`
FROM `orders` `o1`
WHERE `o1`.`dt_end` BETWEEN '2007-12-12 00:00:00.000' /*input interval: date of start*/  AND '2007-12-30 00:00:00.000' 
GROUP BY `o1`.`panel_id`
) `orders_temp`
GROUP BY `orders_temp`.`panel_id`
HAVING `total_counter` = 0

PM MAIL   Вверх
whoever
Дата 30.1.2008, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 5.7.2007

Репутация: нет
Всего: 1



Этот запрос вернет список panel_id. Чтобы получить затем все заказы к щитам из этого списка, использую запрос:
Код

SELECT * FROM orders WHERE panel_id IN (...ваш запрос...)

Насколько это будет накладно и нет ли способа быстрее?
PM   Вверх
skyboy
Дата 31.1.2008, 00:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



Цитата(whoever @  30.1.2008,  15:48 Найти цитируемый пост)
и нет ли способа быстрее? 

есть. вообще не делать такого. 
зачем тебе может понадобится получать заказы к щиту, который в определенный период свободен?! просвети, а то не усну ведь smile
PM MAIL   Вверх
whoever
Дата 31.1.2008, 00:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 5.7.2007

Репутация: нет
Всего: 1



Есть список рекламных щитов. Клиенту нужно показать щиты, которые свободны в выбранные месяцы, и его состояния (занят/не занят, которые определяю по наличию заказа) на 18 месяцев подряд. Именно для этого нужны не только щиты, но и заказы.

И, конечно, спасибо большое за помощь ^_^
PM   Вверх
skyboy
Дата 31.1.2008, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



Цитата(whoever @  30.1.2008,  23:54 Найти цитируемый пост)
которые свободны в выбранные месяцы

    т.е. щит орендуется сроком на месяц? с первого числа по последнее? тогда запрос можно облегчить....
PM MAIL   Вверх
whoever
Дата 31.1.2008, 01:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 5.7.2007

Репутация: нет
Всего: 1



В частном случае - да. Но система строится так, что допускается возможность аренды на любой срок. Да и из эстетических соображений хочется построить именно так :)
Что же там насчет второй части вопроса?
PM   Вверх
skyboy
Дата 31.1.2008, 01:32 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



нет. сдаюсь. :(
вариант со временной таблицей, как мне кажется, неоправданно много данных будет перебрасывать; INNER JOIN на подзапрос будет едва ли быстрее, чем IN... наверное, можно так и оставить. Хотя для "красоты"  можно и использовать INNУК JOIN там, где используется IN.
Возможно, при повышенных требования к скорости выборки, я бы параллельно работал с таблицей "незанятые временные интервалы", которую бы обрабатывал параллельно со вставкой нового заказа в orders - это увелчило бы время вставки новых записей и модификации, но сократило бы время выборки "щитов, свободных в указанное время" и "заказов а щиты, которые свободны в указанное время". Потому как индексы на реальную таблицу, вместо группировки по подзапросу smile
PM MAIL   Вверх
whoever
Дата 31.1.2008, 01:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 5.7.2007

Репутация: нет
Всего: 1



А разве при использовании таблицы незанятых временных интервалов нам не придется так же искать пересечения с той разницей, что теперь нужно будет искать не исключающее пересечение, а включающее?
PM   Вверх
skyboy
Дата 31.1.2008, 02:19 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



whoever, да. заметь: без UNION и группировки с подсчетом количества. всего лишь один запрос с одним параметром WHERE: BETWEEN ... AND ... Да, и сделать потом JOIN будет просто(и быстро - будут использоваться индексы на panel_id)
PM MAIL   Вверх
whoever
Дата 31.1.2008, 02:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 5.7.2007

Репутация: нет
Всего: 1



Спасибо smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0945 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.