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

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

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

Есть запрос
Листинг программы
  1. SELECT DATE_FORMAT(day_price.date,'%d.%m.%Y') AS DATE, day_price.price,
  2. IF((default_price.price - day_price.price)=0, 'Цена по-умолчанию', 'Особая цена' ) AS price_type
  3. FROM day_price
  4. INNER JOIN default_price ON day_price.id=default_price.id
  5. 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
Листинг программы
  1. CREATE TEMPORARY TABLE `temp` (
  2.     `date` DATE NOT NULL,
  3.     PRIMARY KEY (`date`)
  4.   );
  5.  
  6.   delimiter //;
  7.   CREATE PROCEDURE `date_between` ( dfrom DATE, dto DATE )
  8.   BEGIN
  9.     DECLARE curr DATE;
  10.     SET curr = dfrom;
  11.     WHILE ( curr <=  dto ) DO
  12.       INSERT INTO `temp` (DATE) VALUES (curr);
  13.       SET curr = curr + INTERVAL 1 DAY;
  14.     END WHILE;
  15.   END//;
  16.   delimiter ;
  17.   CALL date_between('2017-08-01', '2017-08-12');
  18. SET @id = (SELECT price FROM default_price WHERE id = '53');
  19. DROP PROCEDURE `date_between`;
  20.  
  21.   SELECT  DATE_FORMAT(temp.date,'%d.%m.%Y') AS DATE,
  22.  IF(day_price.id != '53' OR day_price.id IS NULL, @id, day_price.price) AS price,
  23.  IF(day_price.id != '53' OR day_price.id IS NULL, 'Цена по-умолчанию', 'Особенная цена') AS price_type
  24.   FROM temp
  25. LEFT JOIN day_price ON temp.date=day_price.date
  26. LEFT JOIN default_price ON day_price.id=default_price.id
  27. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут