· 7 years ago · Nov 05, 2018, 08:20 PM
1id price
210 3000
334 5000
453 5000
5
6id price date
753 3500 01.10.2017
853 5500 05.10.2017
953 1500 09.10.2017
1053 2500 10.10.2017
1153 2500 11.10.2017
1253 2500 12.10.2017 Â
1310 3500 02.10.2017
14
15date price price_type
1601.10.2017 3500 оÑÐ¾Ð±Ð°Ñ Ñ†ÐµÐ½Ð°
1702.10.2017 5000 цена по-умолчанию
1803.10.2017 5000 цена по-умолчанию
1904.10.2017 5000 цена по-умолчанию
2005.10.2017 5500 оÑÐ¾Ð±Ð°Ñ Ñ†ÐµÐ½Ð°
2106.10.2017 5000 цена по-умолчанию
2207.10.2017 5000 цена по-умолчанию
2308.10.2017 5000 цена по-умолчанию
2409.10.2017 1500 оÑÐ¾Ð±Ð°Ñ Ñ†ÐµÐ½Ð°
2510.10.2017 2500 оÑÐ¾Ð±Ð°Ñ Ñ†ÐµÐ½Ð°
26
27select dp.id,
28 c.calendar as date,
29 ifnull(dap.price, dp.price) as price,
30 if(dap.price is not null, 'оÑÐ¾Ð±Ð°Ñ Ñ†ÐµÐ½Ð°', 'цена по умолчанию') as price_type
31from default_price dp
32 /* здеÑÑŒ берете таблицу Ñ Ð´Ð°Ñ‚Ð°Ð¼Ð¸, чтобы получить календарь,
33 можно его заранее ограничить, еÑли дат много */
34 join (select distinct date as calendar
35 from calendar_table
36 where date between '...' and '...'
37 ) c on 1=1
38 left join day_price dap on dp.id = dap.id and dap.date = c.calendar
39
40DROP PROCEDURE IF EXISTS temp_calendar;
41/* Тут опиÑываетÑÑ Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ð° ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð¾Ð¹ таблицы и поÑледующим заполением периодом дат */
42DELIMITER //
43CREATE PROCEDURE temp_calendar(dateStart DATE, dateEnd DATE)
44BEGIN
45CREATE TEMPORARY TABLE temp_calendar (
46 date DATE not null
47 );
48 WHILE dateStart <= dateEnd DO
49 INSERT INTO temp_calendar VALUES (dateStart);
50 SET dateStart = date_add(dateStart, INTERVAL 1 DAY);
51 END WHILE;
52END;
53//
54DELIMITER ;
55/* "Создание таблицы" */
56CALL temp_calendar('2017-10-01','2017-10-10');
57/* И Ñам Ð·Ð°Ð¿Ñ€Ð¾Ñ */
58SELECT dp.id,
59 c.calendar as date,
60 ifnull(dap.price, dp.price) as price,
61 if(dap.price is not null, 'оÑÐ¾Ð±Ð°Ñ Ñ†ÐµÐ½Ð°', 'цена по-умолчанию') as price_type
62from default_price dp
63 join (SELECT DISTINCT date as calendar
64 from temp_calendar) c on 1=1
65 LEFT JOIN day_price dap on dp.id = dap.id and dap.date = c.calendar WHERE dp.id = 53 ORDER BY date;