[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Создание вложенного запроса
Страницы: 1, 2, 3
masterlelik
Просьба помочь создать запрос для следующей задачи.
В БД есть строки со следующими полями:
id | hotel_id | date_begin | date_end | price | currency
И, например, значениями

1 | 300 | 01.07.2016 | 09.07.2016 | 100 | usd
2 | 300 | 10.07.2016 | 19.07.2016 | 200 | usd
3 | 300 | 20.07.2016 | 29.07.2016 | 150 | usd

Пользователь вводит в поисковой форме разброс дат с 05.07.2016 по 21.07.2016
Количество дней: 7
и сумму за проживания от 1000 $ до 1500 $

В результате надо найти все отрезки дат подходящие под эти условия с подсчитанной суммой.
Например, первый найденный отрезок будет: с 06.07.2016 по 12.07.2016 и стоимостью проживания 1000 $



_____________
Kusss
Даты храните как текст, или есть возможность переделать это в нормальный формат SQL "date" ? XXX-XX-XX

Kusss
SELECT 
*
FROM
`table`
WHERE
STR_TO_DATE(date_begin, GET_FORMAT(DATE,'EUR')) >= STR_TO_DATE('05.07.2016', GET_FORMAT(DATE,'EUR')) AND
STR_TO_DATE(date_end, GET_FORMAT(DATE,'EUR')) <= STR_TO_DATE('21.07.2016', GET_FORMAT(DATE,'EUR')) AND
1000 <= (SELECT SUM(price*7) FROM `table`) <= 1500
masterlelik
Цитата (Kusss @ 4.07.2016 - 18:14)
Даты храните как текст, или есть возможность переделать это в нормальный формат SQL "date" ? XXX-XX-XX

В таком формате и храню (формат поля DATE), это я для наглядности в таком виде отобразил даты)

_____________
masterlelik
Цитата (Kusss @ 4.07.2016 - 18:41)
  1000 <= (SELECT SUM(price*7) FROM `table`) <= 1500

Тут насколько я понимаю, будут выбираться только данные соответствующие каждой строки, но не сможет найти результирующую сумму для отрезка 06.07.2016 по 12.07.2016


_____________
Kusss
masterlelik
Да, я не правильно понял первоначальный вопрос.

Я бы сделал обработку средствами php.
В MySQL Выбирал бы отрезки дат совпадающие с запросом дат, и сумма меньше запроса.
Ну и далее в цикле перебор по дням до нужной суммы.

Цитата
Например, первый найденный отрезок будет: с 06.07.2016 по 12.07.2016 и стоимостью проживания 1000 $
а почему с 06, если выборка получается следующая
05.07 - 12.07 (500+600) и до 15.07 - 21.07 (1000+150)
masterlelik
Цитата (Kusss @ 5.07.2016 - 06:47)
а почему с 06, если выборка получается следующая
05.07 - 12.07 (500+600) и до 15.07 - 21.07 (1000+150)

Потому что 12.07 - это уже будет 8й день.
Если с 05.07, то последний день будет 11.07 и всего тогда получится 900$

Цитата
Я бы сделал обработку средствами php.

в этом случае будут выбраны избыточные данные, наверняка можно сделать это запросом))

_____________
Kusss
Выборка будет маленькая.
У тебя в данном примере на выходе будет 2 строки.

И как ты собираешься обрабатывать конечную дату ?
Ведь по сути результат должен быть следующим.

06.07 - 12.07 : (400+600)= 1000
07.07 - 13.07 : (300 + 800) = 1100
08.07 - 14.07 : (200 + 1000) = 1200
09.07 - 15.07 : (100 + 1200) = 1300
10.07 - 16.07 : (1400) = 1400
11.07 - 17.07 : (1400) = 1400
12.07 - 18.07 : (1400) = 1400
13.07 - 19.07 : (1400) = 1400
14.07 - 20.07 : (1200 + 150) = 1350
15.07 - 21.07 : (1000 + 300) = 1300
masterlelik
Цитата
Ведь по сути результат должен быть следующим.


Хорошо, спасибо

_____________
S.Chushkin
Цитата (masterlelik @ 5.07.2016 - 11:19)
в этом случае будут выбраны избыточные данные, наверняка можно сделать это запросом))

Конечно можно, но... Kusss прав, алгоритм лучше сделать на PHP. Это проще и скорее всего работать будет быстрее.
А данных, передаваемых с SQL-сервера клиенту будет совсем мало. В примере, максимум это будет всего 17 строк, если данные в таблице хранятся подневно. А если попериодно (как в условии), то и того меньше. Для исходного примера весь алгоритм (вместе с запросом к SQL-серверу) будет выполняться 1-2 тысячных секунды.

_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
Valick
Цитата (S.Chushkin @ 5.07.2016 - 12:30)
Kusss прав, алгоритм лучше сделать на PHP. Это проще и скорее всего работать будет быстрее.
S.Chushkin
Цитата (Valick @ 5.07.2016 - 13:57)
глупости
Guest
я бы в пхп сделал временную таблицу со списком всех аозможных подходящих дат и потом уже делал основной запрос
Valick
Guest, бинго.


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

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


_____________
Стимулятор ~yoomoney - 41001303250491
Быстрый ответ:

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