Цитата |
S.Chushkin, соскучился? |
Цитата (Valick @ 5.07.2016 - 10:39) |
S.Chushkin, соскучился?))) Я говорю про то, что если задача требует решения на РНР, то это одно из двух: 1 не хватает квалификации написать грамотный запрос. 2 не хватает квалификации грамотно организовать структуру БД. ну и действительно часто забывают про временные таблицы |
Цитата (masterlelik @ 6.07.2016 - 12:21) |
Таблица создана с обычной структурой - улучшить тут особо негде. |
Цитата (masterlelik @ 6.07.2016 - 12:43) |
Надо найти временные отрезки и их стоимости. Если человек ищет за весь календарный месяц 7ми дневный отрезок, то ему должно выдать все 7ми дневные отрезки, которые входят в этот месяц и соответствуют его цене. Таких отрезков может быть 1-2 (или не быть вовсе), а может быть все возможные варианты, а это в 30ти дневном месяце получится 24 отрезка. |
Цитата (Valick @ 6.07.2016 - 11:01) |
Подобную задачу я решал примерно в 2009 году (как раз с применением временной таблицы для задания параметров выборки... |
$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) . ";
";
}