masterlelik
4.07.2016 - 21:39
Просьба помочь создать запрос для следующей задачи.
В БД есть строки со следующими полями:
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 $
_____________
Даты храните как текст, или есть возможность переделать это в нормальный формат SQL "date" ? XXX-XX-XX
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
5.07.2016 - 07:34
Цитата (Kusss @ 4.07.2016 - 18:14) |
Даты храните как текст, или есть возможность переделать это в нормальный формат SQL "date" ? XXX-XX-XX |
В таком формате и храню (формат поля DATE), это я для наглядности в таком виде отобразил даты)
_____________
masterlelik
5.07.2016 - 08:55
Цитата (Kusss @ 4.07.2016 - 18:41) |
1000 <= (SELECT SUM(price*7) FROM `table`) <= 1500 |
Тут насколько я понимаю, будут выбираться только данные соответствующие каждой строки, но не сможет найти результирующую сумму для отрезка 06.07.2016 по 12.07.2016
_____________
masterlelik
Да, я не правильно понял первоначальный вопрос.
Я бы сделал обработку средствами php.
В MySQL Выбирал бы отрезки дат совпадающие с запросом дат, и сумма меньше запроса.
Ну и далее в цикле перебор по дням до нужной суммы.
Цитата |
Например, первый найденный отрезок будет: с 06.07.2016 по 12.07.2016 и стоимостью проживания 1000 $ |
а почему с 06, если выборка получается следующая
05.07 - 12.07 (500+600) и до 15.07 - 21.07 (1000+150)
masterlelik
5.07.2016 - 11:19
Цитата (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. |
в этом случае будут выбраны избыточные данные, наверняка можно сделать это запросом))
_____________
Выборка будет маленькая.
У тебя в данном примере на выходе будет 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
5.07.2016 - 13:19
Цитата |
Ведь по сути результат должен быть следующим. |
Хорошо, спасибо
_____________
S.Chushkin
5.07.2016 - 13:30
Цитата (masterlelik @ 5.07.2016 - 11:19) |
в этом случае будут выбраны избыточные данные, наверняка можно сделать это запросом)) |
Конечно можно, но... Kusss прав, алгоритм лучше сделать на PHP. Это проще и скорее всего работать будет быстрее.
А данных, передаваемых с SQL-сервера клиенту будет совсем мало. В примере,
максимум это будет всего 17 строк, если данные в таблице хранятся подневно. А если попериодно (как в условии), то и того меньше. Для исходного примера весь алгоритм (вместе с запросом к SQL-серверу) будет выполняться 1-2 тысячных секунды.
_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
Цитата (S.Chushkin @ 5.07.2016 - 12:30) |
Kusss прав, алгоритм лучше сделать на PHP. Это проще и скорее всего работать будет быстрее. |
S.Chushkin
5.07.2016 - 14:27
Цитата (Valick @ 5.07.2016 - 13:57) |
глупости |
я бы в пхп сделал временную таблицу со списком всех аозможных подходящих дат и потом уже делал основной запрос
S.Chushkin, соскучился?))) Я говорю про то, что если задача требует решения на РНР, то это одно из двух:
1 не хватает квалификации написать грамотный запрос.
2 не хватает квалификации грамотно организовать структуру БД.
ну и действительно часто забывают про временные таблицы
_____________
Стимулятор ~yoomoney - 41001303250491
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.