[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Создание вложенного запроса
Страницы: 1, 2, 3
S.Chushkin
Цитата
S.Chushkin, соскучился?

Не. Тут задача не так проста, как кажется (автор или не все условия описал или ещё их не понял). Оптимальное решение будет, если делать на ПХП, а с БД получить только требуемые начальные параметры.
Конечно можно всё сделать и на SQL-движке в хранимке, но это будет немного сложнее и немного медленнее, т.е. менее оптимально.

_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
S.Chushkin
Valick, а вообще, если не лень или хочется "блестнуть", сделай такой "запрос".
А я тебе потом скажу что не так, если сделаешь неправильно. wink.gif Хороший опыт будет...

_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
chee
Valick, +1.

Но! ТС, сформируй условия внятно. Я так и не понял, что ты хочешь сделать с найденными отрезками и их суммами.

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
Valick
S.Chushkin, у меня на форум то времени нет зайти нормально, не то что блестеть wink.gif Да и прошло то время когда я что-то доказывал себе и другим. Подобную задачу я решал примерно в 2009 году (как раз с применением временной таблицы для задания параметров выборки, которая кстати формировалась средствами РНР, так что если не принимать мои выше написанные слова всерьёз, не так уж и бесполезен РНР smile.gif ), не думаю, что с того времени я изрядно поглупел.
Кстати сильно не люблю хранимые процедуры, процедуры обычно случаются когда лезут с "процедурным рылом в декларативный ряд" smile.gif На всякий случай уточню, что это не про вас, а в общем.

_____________
Стимулятор ~yoomoney - 41001303250491
masterlelik
Цитата (Valick @ 5.07.2016 - 10:39)
S.Chushkin, соскучился?))) Я говорю про то, что если задача требует решения на РНР, то это одно из двух:
1 не хватает квалификации написать грамотный запрос.
2 не хватает квалификации грамотно организовать структуру БД.

ну и действительно часто забывают про временные таблицы

Таблица создана с обычной структурой - улучшить тут особо негде.
А вот про грамотный запрос изначально и поинтересовался:)

А с временной таблицей надо будет попробовать.

_____________
masterlelik
@chee
@S.Chushkin

Надо найти временные отрезки и их стоимости.
Если человек ищет за весь календарный месяц 7ми дневный отрезок, то ему должно выдать все 7ми дневные отрезки, которые входят в этот месяц и соответствуют его цене.
Таких отрезков может быть 1-2 (или не быть вовсе), а может быть все возможные варианты, а это в 30ти дневном месяце получится 24 отрезка.


_____________
S.Chushkin
Цитата (masterlelik @ 6.07.2016 - 12:21)
Таблица создана с обычной структурой - улучшить тут особо негде.

Можно. И нужно. И тогда временная таблица не понадобится, скорее всего.

_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
S.Chushkin
Цитата (masterlelik @ 6.07.2016 - 12:43)
Надо найти временные отрезки и их стоимости.
Если человек ищет за весь календарный месяц 7ми дневный отрезок, то ему должно выдать все 7ми дневные отрезки, которые входят в этот месяц и соответствуют его цене.
Таких отрезков может быть 1-2 (или не быть вовсе), а может быть все возможные варианты, а это в 30ти дневном месяце получится 24 отрезка.

Предполагаю, что вы забыли указать ещё два условия:
- "с 05.07.2016 по 21.07.2016" - диапазон непрерывный
- "hotel_id, date" может быть уже забронирован (т.е. не участвует в расчёте)
Соответственно алгоритм усложнится и написать единый запрос для расчёта будет непросто и он будет неоптимален по скорости. Поэтому я и утверждал выше, что эту задачу лучше делать на ПХП.

Цитата (Valick @ 6.07.2016 - 11:01)
Подобную задачу я решал примерно в 2009 году (как раз с применением временной таблицы для задания параметров выборки...

Ещё раз: я не утверждаю, что задачу нельзя решить одним запросом. Я утверждаю, что это будет более неэффективный вариант решения, чем решение на ПХП. (с учётом сказанного выше)
И поэтому правильным решением будет получить список цен по датам за требуемый период (sql-запрос) и затем в ПХП создать массив массивов и обычным циклом по ним найти все подходящие по сумме периоды. (можно усложнить реализацию для ускорения, но в данном случае в этом нет необходимости, т.к. общее время выполнения будет ~1-2 тысячных секунды)

_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
Guest
S.Chushkin
$period = array(strtotime('2016-07-05 08:00:00'), strtotime('2016-07-21 11:00:00'));    // проверяемый период
$nights = 7; // кол-во ночей
$prices = array(1000, 1500); // разброс цен
$hotel_id = 300; // ID гостиницы

$dates = array(); // список всех возможных комбинаций дат
$tmpTable = 'tmpT' . mt_rand(); // временная таблица
$priceTable = '_prices'; // таблица с датами и ценами

// заполняем массив всех возможных комбинаций дат

for($i = $period[0], $j = $period[0] + ($nights - 1) * 86400; $j < $period[1]; $i += 86400, $j += 86400)
$dates[] = "('" . date('Y-m-d', $i) . "', '" . date('Y-m-d', $j) . "')";


if (count($dates)){
// создаем временную таблицу
$que = "CREATE TEMPORARY TABLE `" . $tmpTable . "` (
`dateFrom` DATE NOT NULL,
`dateTill` DATE NOT NULL
) ENGINE=MEMORY;"
;

// заполняем её
$que = "INSERT INTO `" . $tmpTable . "`(`dateFrom`, `dateTill`) VALUES" . implode(',', $dates) . ";";

// получаем список всех заказов подходящих под условия
$que = "SELECT `dateFrom`, `dateTill`, SUM(`cn`) as `nights`, SUM(`cn` * `price`) as `price`
FROM (
SELECT tmp.*, DATEDIFF(LEAST(tmp.dateTill, p.date_end), GREATEST(tmp.dateFrom, p.date_begin)) + 1 as `cn`, p.price
FROM `"
. $tmpTable . "` AS `tmp` INNER JOIN `" . $priceTable . "` AS `p` ON (tmp.dateFrom <= p.date_end AND tmp.dateTill => p.date_begin)
WHERE p.hotel_id = "
. $hotel_id . "
) AS `subq`
GROUP BY `dateFrom`
HAVING `nights` >= "
. $nights . " AND `price` BETWEEN " . implode(' AND ', $prices) . ";
"
;
}
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.