@arsenaljek

Вывод недостающих дат?

У меня есть такая таблица

+------------+------------+------------+
| id | price | date |
+------------+------------+------------+
| 1 | 3000 | 2019-01-26 |
| 2 | 2500 | 2019-01-23 |
| 3 | 2000 | 2019-01-22 |
| 4 | 3000 | 2019-01-21 |
+------------+------------+------------+
Мне нужно, добавить все недостающие даты и присвоить им цены. При выводе на php


+------------+------------+------------+
| id | price | date |
+------------+------------+------------+
| 100 | 3000 | 2019-01-28 |
| 100 | 3000 | 2019-01-27 |
| 100 | 3000 | 2019-01-26 |
| 100 | 2500 | 2019-01-25 |
| 100 | 2500 | 2019-01-24 |
| 100 | 2500 | 2019-01-23 |
| 100 | 2000 | 2019-01-22 |
| 100 | 3000 | 2019-01-21 |
+------------+------------+------------+

Я пытаюсь и делаю так, но естественно он выводит только то, что уже есть в базе

$sql = "SELECT products.id_lab, products.vendor, products.vendor_code, products.name, products.author, products.description, products.image_product, products.link_product, prices.price_product, prices.date AS max_date 
	FROM products 
	LEFT OUTER JOIN prices ON products.id_lab = prices.id_lab
	WHERE prices.price_product != 0 AND products.id_lab = '".$row_product['id_lab']."'
	ORDER BY prices.date DESC, prices.price_product DESC;";
	$result = mysqli_query($link,$sql);
	foreach($result as $article1) {
	    if (isset($article1['price_product'])) {
	        $articles2[date("d.m.Y",strtotime($article1['max_date']))] = (int)$article1['price_product'];
	    }
	}
	foreach($result as $article2) {
	    if (isset($article1['price_product'])) {
	        $articles1[date("d.m.Y",strtotime($article2['max_date']))] = (int)$article2['price_product'];
	    }
	}
  • Вопрос задан
  • 146 просмотров
Пригласить эксперта
Ответы на вопрос 2
webinar
@webinar Куратор тега PHP
Учим yii: https://youtu.be/-WRMlGHLgRg
Вам нужно в php создать массив дат, а далее заполнять его ценами дергая их из другого массива, который получили из базы. При этом наверное удобнее будет индексировать массив по датам.
Ответ написан
Ninazu
@Ninazu
Ну тогда в вашей денормализации есть смысл.

Сложно понять структуру вашей базы по вашему куску кода. Поэтому код пишу наугад)

1. Нужно сформировать весь возможный диапазон дат на PHP
$period = new DatePeriod(
     new DateTime('2019-01-21'),
     new DateInterval('P1D'),
     new DateTime('2019-01-28')
);

$dates = [];

foreach($period as $date){
   $dates[] = $date->format("Y-m-d"); 
}


2. Получаем цены которые уже есть в базе для товаров
$where = " WHERE p.date IN ('" . implode(",'", $dates) . "')";


3. Построить cписок недостающих цен по массиву $dates и продуктам с их ценами.
$data[$product][$price][] = $date;
////.......
foreach($data[$product][$price] as $datesInDb){
     $missing = array_diff($dates, $datesInDb);
}


4. Добавить недостающие записи для продуктов
INSERT IGNORE INTO prices (columns)
VALUES (valueList),
      (valueList),
      ...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
от 140 000 до 170 000 ₽
Stream Telecom Санкт-Петербург
от 120 000 ₽
Хабр Москва
от 200 000 до 230 000 ₽
08 июн. 2023, в 21:25
700 руб./за проект
08 июн. 2023, в 20:17
5000 руб./за проект
08 июн. 2023, в 20:14
2000 руб./за проект