Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Ежедневные цены и INSERT, UPDATE, SUM по диапазонам дат. / 2 сообщений из 2, страница 1 из 1
18.07.2017, 19:35
    #39491151
Avgust0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ежедневные цены и INSERT, UPDATE, SUM по диапазонам дат.
Доброго всем здравия.

Столкнулся с очередной заковыристой задачей. (MySQL MariaDB-10.1.21)

Имеется таблица с ценами на помещения, сдающиеся в аренду посуточно.
Цена хранится на каждый день и за каждое помещение.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TABLE `price` (
 `price_id` bigint(20) unsigned NOT NULL auto_increment, 
 `price_place` tinyint(2) unsigned NOT NULL default '0', -- id помещения, их кол-во - до сотни
 `price_val` int(6) unsigned NOT NULL default '0', -- цена аренды
 `price_date` date NOT NULL, -- дата 2017-07-17
 PRIMARY KEY (price_id) 
 ,KEY price_place (price_place)
 ,KEY price_date (price_date)
 -- ,KEY price_place_date (price_place,price_date) -- есть ли смысл в таком ключе?
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;



Из php-формы получаю две даты (диапазон) - дата начала и дата окончания действия цены.
Если нужно изменить/добавить цену за один день, то обе даты просто одинаковые.
Пример данных из формы:
Код: php
1.
2.
3.
4.
$_POST['price_place']       = '2';
$_POST['price_val']         = '200';
$_POST['price_date_start']  = '2017-07-13';
$_POST['price_date_end']    = '2017-07-18';



Что нужно:
1. записывать/обовлять диапазон строк по указанным датам
если запись в БД на указаные [помещение и дату] есть - обновить, иначе - добавить
2. получать сумму на указанный диапазон дат
3. проверять(искать) отсутствующие дни от сегодняшнего на (N) месяцев вперёд.
Чтобы при дальнейшем подсчёте суммы сделки, не оказалось "бесплатных" дней.

Что непонятно как сделать:
1. По п.1 нагуглил INSERT ... ON DUPLICATE KEY UPDATE тут https://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html
Вроде-бы оно, однако, не уверен в применении уникальных индексов на поле `price_date` - для разных помещений точно будут одинаковые даты.
Поэтому - не подходит. Аналогичного решения под свою структуру не нашёл, а городить php-циклы с кучей запросов к БД кажется глупо.
2. По п.3 так-же, кроме php-циклов с кучей запросов на ум инчего не приходит.
Типа сделать часть календаря на php и долбить запросами БД - имхо глупо и брутфорсно как-то.
3. По индксам в БД - не уверен, что правильно расстивил индексы в таблице
там или два отдельных, или один составной, или оба варианта - подскажите у кого есть опыт.

Что, как мне кажется, знаю, но может быть подскажите решение получше:
По п.3 - посчитать сумму сделки - вроде-бы полно примеров в сети
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT 
    SUM(`price_val`) AS `sum_price`, -- сумма за указанный диапазон дат
--  AVG(`price_val`) AS `average_price` -- средняя цена за указанный диапазон дат, если понадобится
FROM 
     `price`
WHERE 
        `price_place` = '2' -- id помещения
   AND
        `price_date` >= '2017-07-13' AND `price_date` <= '2017-07-18' -- тут все данные в одном формате YYYY-MM-DD
 -- `price_date` BETWEEN '2017-07-13' AND '2017-07-18' -- а включительно-ли? и что будет быстрее?
 ;
 



Буду весьма признателен за любую помошь.
Спасибо.
...
Рейтинг: 0 / 0
18.07.2017, 19:47
    #39491159
Avgust0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ежедневные цены и INSERT, UPDATE, SUM по диапазонам дат.
Кажется, понял про INSERT ... ON DUPLICATE KEY UPDATE
Можно-же сделать составной индекс уникальным
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TABLE `price` (
 `price_id` bigint(20) unsigned NOT NULL auto_increment, 
 `price_place` tinyint(2) unsigned NOT NULL default '0', -- id помещения, их кол-во - до сотни
 `price_val` int(6) unsigned NOT NULL default '0', -- цена аренды
 `price_date` date NOT NULL, -- дата 2017-07-17
 PRIMARY KEY (price_id) 
 ,KEY price_place (price_place)
 ,KEY price_date (price_date)
 ,UNIQUE price_place_date (price_place,price_date) -- его и сделать уникальным
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;



p.s. жаль, что нельзя редактировать свои сообщения, даже которые еще без ответа
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Ежедневные цены и INSERT, UPDATE, SUM по диапазонам дат. / 2 сообщений из 2, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]