@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'];
	    }
	}
  • Вопрос задан
  • 175 просмотров
Пригласить эксперта
Ответы на вопрос 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),
      ...
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы