Вывод пустых строк вошедших в диапазон Between - MySQL

Узнай цену своей работы

Формулировка задачи:

Есть запрос
SELECT DATE_FORMAT(day_price.date,'%d.%m.%Y') AS DATE, day_price.price,
IF((default_price.price - day_price.price)=0, 'Цена по-умолчанию', 'Особая цена' ) AS price_type 
FROM day_price
INNER JOIN default_price ON day_price.id=default_price.id 
WHERE day_price.date BETWEEN '2017-08-01' AND '2017-08-12' AND day_price.id = '53'
Результатом его является date | price | price_type 01.08.2017 | 3500 | Особенная цена 05.08.2017 | 4500 | Особенная цена 08.08.2017 | 4500 | Особенная цена .... Нужно получить таблицу вида: 01.08.2017 | 3500 | Особенная цена 02.08.2017 | null | null 03.08.2017 | null | null 04.08.2017 | null | null 05.08.2017 | 4500 | Особенная цена 06.08.2017 | null | null 07.08.2017 | null | null 08.08.2017 | 4500 | Особенная цена Уже "обгуглился"

Решение задачи: «Вывод пустых строк вошедших в диапазон Between»

textual
Листинг программы
CREATE TEMPORARY TABLE `temp` (
    `date` DATE NOT NULL,
    PRIMARY KEY (`date`)
  );
 
  delimiter //;
  CREATE PROCEDURE `date_between` ( dfrom DATE, dto DATE )
  BEGIN 
    DECLARE curr DATE;
    SET curr = dfrom;
    WHILE ( curr <=  dto ) DO 
      INSERT INTO `temp` (DATE) VALUES (curr);
      SET curr = curr + INTERVAL 1 DAY;
    END WHILE;
  END//;
  delimiter ;
  CALL date_between('2017-08-01', '2017-08-12');
SET @id = (SELECT price FROM default_price WHERE id = '53');
DROP PROCEDURE `date_between`;
 
  SELECT  DATE_FORMAT(temp.date,'%d.%m.%Y') AS DATE,
 IF(day_price.id != '53' OR day_price.id IS NULL, @id, day_price.price) AS price,
 IF(day_price.id != '53' OR day_price.id IS NULL, 'Цена по-умолчанию', 'Особенная цена') AS price_type
  FROM temp
LEFT JOIN day_price ON temp.date=day_price.date
LEFT JOIN default_price ON day_price.id=default_price.id
ORDER BY temp.date ASC

Объяснение кода листинга программы

  1. Создаётся временная таблица temp с одним столбцом date типа DATE.
  2. Устанавливается delimiter для того чтобы не возникало конфликтов с названиями других процедур или таблиц в базе данных.
  3. Создаётся процедура date_between с двумя параметрами типа DATE — dfrom и dto.
  4. В процедуре объявляется переменная curr типа DATE и инициализируется значением dfrom.
  5. В цикле WHILEcurr меньше или равно dto вставляется текущее значение curr в таблицу temp.
  6. Значение curr увеличивается на 1 день с помощью оператора INTERVAL.
  7. Выполняется DROP PROCEDURE для удаления процедуры date_between после её использования.
  8. Выполняется CALL date_between('2017-08-01', '2017-08-12') для заполнения таблицы temp данными.
  9. Устанавливается значение переменной @id равным цене по умолчанию для товара с id равным '53'.
  10. Выполняется SELECT запрос с несколькими условиями для вывода данных в нужном формате.
  11. В запросе используется функция DATE_FORMAT для вывода даты в формате день.месяц.год.
  12. Используется функция IF для вывода цены по умолчанию или особой цены в зависимости от наличия или отсутствия записи в таблице day_price для конкретной даты.
  13. Выполняется LEFT JOIN с таблицами day_price и default_price для получения нужных данных.
  14. Запрос упорядочивается по дате в возрастающем порядке.

Оцени полезность:

6   голосов , оценка 3.333 из 5