Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
Страницы: (3) 1 [2] 3  ( Перейти к первому непрочитанному сообщению )  
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Создание вложенного запроса
S.Chushkin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пофигист
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 777
Пользователь №: 36058
На форуме: 3 года, 11 месяцев, 6 дней
Карма: 40




Цитата
S.Chushkin, соскучился?

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


--------------------
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
S.Chushkin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пофигист
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 777
Пользователь №: 36058
На форуме: 3 года, 11 месяцев, 6 дней
Карма: 40




Valick, а вообще, если не лень или хочется "блестнуть", сделай такой "запрос".
А я тебе потом скажу что не так, если сделаешь неправильно. wink.gif Хороший опыт будет...


--------------------
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
chee  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Сын полка
Сообщений: 1780
Пользователь №: 38654
На форуме: 2 года, 11 месяцев
Карма: 40




Valick, +1.

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


--------------------
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации

Мой блог
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Valick  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 5490
Пользователь №: 35718
На форуме: 4 года, 14 дней
Карма: 167




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


--------------------
wmr - R281553014107
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
masterlelik  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пользователь
**

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 96
Пользователь №: 1297
На форуме: 9 лет, 9 месяцев, 21 день
Карма:




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

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

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

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


--------------------
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
masterlelik  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пользователь
**

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 96
Пользователь №: 1297
На форуме: 9 лет, 9 месяцев, 21 день
Карма:




@chee
@S.Chushkin

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


--------------------
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
S.Chushkin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пофигист
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 777
Пользователь №: 36058
На форуме: 3 года, 11 месяцев, 6 дней
Карма: 40




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

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


--------------------
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
S.Chushkin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пофигист
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 777
Пользователь №: 36058
На форуме: 3 года, 11 месяцев, 6 дней
Карма: 40




Цитата (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 тысячных секунды)


--------------------
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Guest  
[x] Дата
Цитировать сообщение


Гость пожелал остаться неизвестным

Unregistered









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) . ";
"
;
}
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Guest  
Дата
Цитировать сообщение


Гость пожелал остаться неизвестным

Unregistered









user posted image
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
S.Chushkin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пофигист
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 777
Пользователь №: 36058
На форуме: 3 года, 11 месяцев, 6 дней
Карма: 40




"Guest не читатель, Guest писатель" wink.gif

1) Очень не эффективно.
2) Частный случай (т.е. не учитывается "может быть уже забронировано")
3) Запрос не рабочий (см. dateTill)


--------------------
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Guest  
Дата
Цитировать сообщение


Гость пожелал остаться неизвестным

Unregistered









S.Chushkin, "птица-говорун отличается умом и сообразительностью"

Цитата (S.Chushkin @ 6.07.2016 - 14:51)
2) Частный случай (т.е. не учитывается "может быть уже забронировано")

Где это указано у ТС ? в большинстве случаев этот вопрос решается всего лишь добавлением еще одной таблицы в запрос.

Цитата (S.Chushkin @ 6.07.2016 - 14:51)
3) Запрос не рабочий (см. dateTill)

"dateTill" - это не дата выезда, а дата последней ночи в гостинице. Т.е. при заказе одной ночи dateTill будет равен dateFrom.
Вы бы, господин хороший, взяли карандашик, бумажечку и посчитали ручками...

А по-поводу неэффективности - вы напишите ваш вариант, попросим ТСа дать живую табличку и посмотрим чей вариант эффективнее.... а то болтать каждый горазд...
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
S.Chushkin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пофигист
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 777
Пользователь №: 36058
На форуме: 3 года, 11 месяцев, 6 дней
Карма: 40




Цитата (Guest @ 6.07.2016 - 15:02)
S.Chushkin, "птица-говорун отличается умом и сообразительностью"

100%! smile.gif

Цитата
Где это указано у ТС ?  в большинстве случаев этот вопрос решается всего лишь добавлением еще одной таблицы в запрос.


Не сказано. И "Конечно".
Суть то не в том, чтобы "сделать", суть - "сделать правильно". А так конечно, решить можно разными способами.

Цитата
"dateTill" - это не дата выезда, а дата последней ночи в гостинице. Т.е. при заказе одной ночи dateTill будет равен dateFrom.
Вы бы, господин хороший, взяли карандашик, бумажечку и посчитали ручками...

Мы все советчики smile.gif
Поэтому тоже дам совет, - внимательно почитайте доку по поводу GROUP BY и поймёте, почему запрос не рабочий.

Цитата
А по-поводу неэффективности - вы напишите ваш вариант, попросим ТСа дать живую табличку и посмотрим чей вариант эффективнее.... а то болтать каждый горазд...

Как правильно написал Valick "...прошло то время когда я что-то доказывал себе и другим.".
Или другими словами - "Я прокукарекал, а там хош рассветай, хош не рассветай". smile.gif
п.с.
Я, как и Valick, несколько лет назад делал подобную задачу (поиск диапазона в списках) и среди нескольких вариантов оптимальный был именно тот, о котором я говорил выше (правда алгоритм был более навороченный, так как было ещё условие - максимальная скорость). В общем-то, частично поэтому и встрял - типа, "знаем, плавали". smile.gif


--------------------
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
masterlelik  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пользователь
**

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 96
Пользователь №: 1297
На форуме: 9 лет, 9 месяцев, 21 день
Карма:




Цитата (S.Chushkin @ 6.07.2016 - 10:16)
Предполагаю, что вы забыли указать ещё два условия:
- "с 05.07.2016 по 21.07.2016" - диапазон непрерывный
- "hotel_id, date" может быть уже забронирован (т.е. не участвует в расчёте)

Считаем, что непрерывный и броней нет.

P.S. как сказано чуть выше Guest если, будут брони, то это решается введением доп. таблицы, в которой будут храниться "склейки" непрерывных временных отрезков по конкретному отелю.
Но самих броней не предвидится.


--------------------
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Guest  
Дата
Цитировать сообщение


Гость пожелал остаться неизвестным

Unregistered









Цитата (S.Chushkin @ 6.07.2016 - 15:24)
Я, как и Valick, несколько лет назад делал подобную задачу (поиск диапазона в списках) и среди нескольких вариантов оптимальный был именно тот, о котором я говорил выше (правда алгоритм был более навороченный, так как было ещё условие - максимальная скорость). В общем-то, частично поэтому и встрял - типа, "знаем, плавали".


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

Что касается GROUP BY, то я полагаю, ты имеешь в виду ошибку возникающую при включенном ONLY_FULL_GROUP_BY. Учитывая что в ~95% существующих версий мускуля эта опция по-умолчанию выключена, называть запрос нерабочим, мягко говоря, охренительное преувеличение.
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

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

Опции темыСтраницы: (3) 1 [2] 3  Ответ в темуСоздание новой темыСоздание опроса