Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Запрос для обновления максимальной и минимальной цены товаров в категории


Recommended Posts

Здравствуйте!

Создал в таблице oc_category 2 поля min_price и max_price. Хочу занести в эти поля минимальную и максимальную цену. Пытаюсь сделать это таким запросом

 

UPDATE `oc_category` SET (min_price, max_price) = (
SELECT 
	path_id AS category_id,
	MIN(IFNULL(ps.price, p.price)) AS min_price, 
	MAX(IFNULL(ps.price, p.price)) AS max_price
FROM oc_product AS p 
LEFT JOIN oc_product_to_category AS ptc USING(product_id) 
LEFT JOIN oc_category_path USING(category_id)
LEFT JOIN oc_product_special AS ps USING(product_id) 
WHERE IFNULL(ps.price, p.price) > 0
AND path_id IS NOT NULL
AND p.quantity > 1 
AND p.date_available <= NOW() 
GROUP BY path_id)

 

Но он не работает, хотя SELECT отдельно выводится.

Буду благодарен за помощь! Спасибо!

Надіслати
Поділитися на інших сайтах

26 минут назад, max1985 сказал:

Здравствуйте!

Создал в таблице oc_category 2 поля min_price и max_price. Хочу занести в эти поля минимальную и максимальную цену. Пытаюсь сделать это таким запросом

 


UPDATE `oc_category` SET (min_price, max_price) = (
SELECT 
	path_id AS category_id,
	MIN(IFNULL(ps.price, p.price)) AS min_price, 
	MAX(IFNULL(ps.price, p.price)) AS max_price
FROM oc_product AS p 
LEFT JOIN oc_product_to_category AS ptc USING(product_id) 
LEFT JOIN oc_category_path USING(category_id)
LEFT JOIN oc_product_special AS ps USING(product_id) 
WHERE IFNULL(ps.price, p.price) > 0
AND path_id IS NOT NULL
AND p.quantity > 1 
AND p.date_available <= NOW() 
GROUP BY path_id)

 

Но он не работает, хотя SELECT отдельно выводится.

Буду благодарен за помощь! Спасибо!

А можно вопрос, зачем вам отдельные поля для этого в таблице? Если это вычисляемое поле, причем эти данные есть у вас на странице категории.

Надіслати
Поділитися на інших сайтах


4 минуты назад, niger сказал:

А можно вопрос, зачем вам отдельные поля для этого в таблице? Если это вычисляемое поле, причем эти данные есть у вас на странице категории.

Чтоб не грузило базу при каждой загрузке страницы категории. Большое к-во товаров в родительской категории.

Надіслати
Поділитися на інших сайтах

Берете просто из своего массива продуктов, которые на странице категории, выбираете колонку цены, делаете number_format, и юзает min(), max() функции, чтобы получать максимальное число и минимальное из массива. 

Надіслати
Поділитися на інших сайтах


1 минуту назад, max1985 сказал:

Чтоб не грузило базу при каждой загрузке страницы категории. Большое к-во товаров в родительской категории.

Кого не грузило? вы этот запрос и так делаете, или откуда у вас цены берутся? от святого духа?

Надіслати
Поділитися на інших сайтах


Вы в контроллере category собираете уже все товары уже с ценами. 

Соберите отдельно рядышком массив цен, когда он готов, отфоматируйте и получите минимальное и максимальное значение массива, и отправьте во вьюуху

И вы получается при каждом обновлении цены любого товара, должны проапдейтить таблицу категории, для обновление макс и мин цены.

И у меня грузит базу, работа с массивом обычным, а у вас нет update? Удивительное рядом.

Надіслати
Поділитися на інших сайтах


15 минут назад, niger сказал:

Кого не грузило? вы этот запрос и так делаете, или откуда у вас цены берутся? от святого духа?

Цены в эту таблицу будут залетать раз в сутки по крону.

Надіслати
Поділитися на інших сайтах

5 хвилин назад, niger сказав:

Вы в контроллере category собираете уже все товары уже с ценами. 

Соберите отдельно рядышком массив цен, когда он готов, отфоматируйте и получите минимальное и максимальное значение массива, и отправьте во вьюуху

И вы получается при каждом обновлении цены любого товара, должны проапдейтить таблицу категории, для обновление макс и мин цены.

И у меня грузит базу, работа с массивом обычным, а у вас нет update? Удивительное рядом.

Контроллер в категории не соберает все товары, а только по лимиту который задаеться в настройках системы.

 

Когда метод вызываеться getProducts, там же указан параметр => $filter_data, в котором есть sort, order, limit, start (страница * лимит)...

 

А человеку возможно нужно всех товаром из категории. Даже те что не попадают в фильтр вызова метода getProducts.

Надіслати
Поділитися на інших сайтах

28 хвилин назад, max1985 сказав:

Цены в эту таблицу будут залетать раз в сутки по крону.

Если по крону тогда сделайте через контроллер

Надіслати
Поділитися на інших сайтах

4 минуты назад, Eldaeron сказал:

Если по крону тогда сделайте через контроллер

Та это сделаю, проблема в составлении запроса, на обновление.

Надіслати
Поділитися на інших сайтах

3 хвилини назад, max1985 сказав:

Та это сделаю, проблема в составлении запроса, на обновление.

  

ControllerExtensionModuleUpdateCronMINMAXPrice {
	$this->load->module('extension/module/updatecronminmaxprice');

	$results = $this->extension_module_updatecronminmaxprice->SelectAllCategories(); // туда заганяете SELECT

	foreach ($results as $result) {
		// перебор 
		$this->extension_module_updatecronminmaxprice->UpdateCategory($result); // А тут упдейт WHERE category_id, ну и ячейки min / max тоже будут...
	}
	
}

ModelExtensionModuleUpdateCronMINMAXPrice {
	UpdateCategory($result) {
..
	}
}

 

Если категорий мало то так можно, даже не парясь. А потом рефактор сделать

 

Потому что UPDATE имя_таблицы SET поле1=значение1, поле2=значение2, поле3=значение3... WHERE условие_по_которому_следует_выбрать_строки Только так.

  • +1 1
Надіслати
Поділитися на інших сайтах

UPDATE `oc_category` AS c
INNER JOIN (
SELECT 
	path_id AS category_id,
	MIN(IFNULL(ps.price, p.price)) AS min_price, 
	MAX(IFNULL(ps.price, p.price)) AS max_price
FROM oc_product AS p 
LEFT JOIN oc_product_to_category AS ptc USING(product_id) 
LEFT JOIN oc_category_path USING(category_id)
LEFT JOIN oc_product_special AS ps USING(product_id) 
WHERE IFNULL(ps.price, p.price) > 0
AND path_id IS NOT NULL
AND p.quantity > 1 
AND p.date_available <= NOW() 
GROUP BY path_id
) AS tmp ON tmp.category_id = c.category_id
SET c.min_price = tmp.min_price, c.max_price = tmp.max_price;

 

  • +1 1
Надіслати
Поділитися на інших сайтах

3 часа назад, Eldaeron сказал:

Контроллер в категории не соберает все товары, а только по лимиту который задаеться в настройках системы.

 

Когда метод вызываеться getProducts, там же указан параметр => $filter_data, в котором есть sort, order, limit, start (страница * лимит)...

 

А человеку возможно нужно всех товаром из категории. Даже те что не попадают в фильтр вызова метода getProducts.

Точно, забыл уже как я это делал. Собирал эти данные и ложил в Кеш на пару суток. Вы правы. Но и там и там запросы, надо смотреть и профилировать - какой вариант экономнее, хотя может быть вообще экономия на спичках

Надіслати
Поділитися на інших сайтах


Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.