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

Условие для правильной выборки цены из БД


Recommended Posts

Приветствую!
Прошу мне помочь в решении задачи.

К товару прикреплены рекомендуемые товары (related2)
Вот такой запрос, достает минимальную цену из списка рекомендуемых товаров которые прикреплены (связаны) к конкретному ID товара.

public function getProductRelated2Minprice($product_id) {
	
	$query = $this->db->query(
		"SELECT MIN(p.price) 
		as min_price 
		FROM  ". DB_PREFIX . "product_related2 pr 
		LEFT JOIN " . DB_PREFIX . "product p ON (pr.related_id = p.product_id) 
		LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) 
		WHERE pr.product_id = '" . (int)$product_id . "' 
		AND p.status = '1' 
		AND p.date_available <= NOW() 
		AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "'
		");
	
	return $query->row['min_price'];
}


То есть на странице продукта у меня есть переменная $min_product которая выводит самую меньшую цену из рекомендуемых товаров.

Хотелось бы, сделать такое условие:
Проверить, если акционная цена у списка рекомендуемых.
Если есть, выбрать ту какая самая минимальная + подтянуть обычную цену этого товара.
А если акционной нет, тогда выбрать минимальную цену (то что у меня уже есть)


С минимальной ценой как то сам разобрался, а вот такое условие, как правильно сделать не знаю..

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


		"SELECT 
		MIN(IFNULL(ps.price,p.price)) AS min_price
		FROM  ". DB_PREFIX . "product_related2 pr 
		LEFT JOIN " . DB_PREFIX . "product p ON (pr.related_id = p.product_id) 
		LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) 
		LEFT JOIN " . DB_PREFIX . "product_special ps ON(p.product_id = ps.product_id)
		WHERE pr.product_id = '" . (int)$product_id . "' 
		AND p.status = '1' 
		AND p.date_available <= NOW() 
		AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "'
Надіслати
Поділитися на інших сайтах


@crapic Не совсем верно потому что надо еще проверять на дату акций

 

@s89 Попробуйте более ясно сформулировать задачу.

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

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

MIN(IFNULL(ps.price,p.price)) AS min_price

 


Спасибо за помощь!
Но немного не то что мне нужно.

Ваша функция выводит минимальную цену акции, а если ее нет, то минимальную цену.
Возможно ли сюда добавить условие?
Если есть цена акционная, то выбрать (по ID) также дефолтную цену этого товара. Что бы можно было вывести 2 цены в шаблоне (зачеркнутую и новую акционную)

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


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

@crapic Не совсем верно потому что надо еще проверять на дату акций

 

@s89 Попробуйте более ясно сформулировать задачу.


Да, на дату надо проверять. Я уж об этом не стал писать, думал сам как то уже разберусь, а то уж и так наверное много прошу :unsure:

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


@crapic Такие запросы с "кондачка" не пишутся.

 

Здесь возникает множество запросов

 

Кортеж из акционных товаров -

Выборка минимальной цены

 

1. Может быть минимальная у неакционного

2. Минимальной может быть акционная

SELECT min(price) from product_related

 

SELECT min(price) from product_special

WHERE условия для действующих акций

AND ps.product_id IN (SELECT product_id FROM product_related)

 

Надеюсь, что получится самому запросы довести до ума?

 

А строить один большой запрос - нет смысла

 

 

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

Я вот сейчас методом проб, что то сделал...
 

	public function getProductRelated2Minprice($product_id) {
		
		$query = $this->db->query(
			"SELECT MIN(p.price) as min_price,
			(SELECT ps.price) as min_special
			FROM  ". DB_PREFIX . "product_related2 pr 
			LEFT JOIN " . DB_PREFIX . "product p ON (pr.related_id = p.product_id) 
			LEFT JOIN " . DB_PREFIX . "product_special ps ON (p.product_id = ps.product_id) 
			WHERE pr.product_id = '" . (int)$product_id . "' 
			AND p.price > '0' 
			AND p.status = '1' 
			AND p.date_available <= NOW() 
			");

		return $query->row['min_price'];
	}

Получаю 2 строки:
1) цена дефолтная (минимальная)
2) ценна акционная (первая по списку в таблице)

Как достать акционную цену именно того товара, который я нашел с минимальной дефолтной ценой?
Я не понимаю можно ли в одном запросе это сделать, как то сравнить ID...

А если несколько запросов, то на данный момент я даже не пойму как их последовательно записать...
Это я уже немного упростил как мне кажется...
В идеале хотел начать проверку с акционной (если она есть) и тогда также по ID взять дефолтную, именно ту которая соответсвует одному и тому же товару

В любом случае благодарю за помощь, есть над чем подумать))

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


27 минут назад, crapic сказал:

SELECT 
MIN(IFNULL(ps.price,p.price)) AS min_price,
IFNULL(ps.price,p.price) as base_price

 

Тут получается:
1) Минимальная цена (акция или обычная не важно, какая меньше)
2) Берет акционную цену первую в списке

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


2 минуты назад, s89 сказал:

Я вот сейчас методом проб, что то сделал...

Какой такой метод проб?

 

Пробовать надо тогда, когда вы в голове получите четкое представление о своей задаче.

Вам нужно два запроса ( я показал смісл єтих запросов)

В модели не обязательно должно быть один и только один запрос - пример getProducts

 

 

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

1 час назад, chukcha сказал:

Какой такой метод проб?

 

Разбираться с MySql начал не давно. Не очень понимаю. Но учусь :rolleyes:

Записал так

	public function getProductMinPrice($product_id) {
		$query = $this->db->query(
			"SELECT MIN(p.price) as min_price
			FROM  ". DB_PREFIX . "product_related2 pr 
			LEFT JOIN " . DB_PREFIX . "product p ON (pr.related_id = p.product_id) 
			WHERE pr.product_id = '" . (int)$product_id . "' 
			AND p.price > '0' 
			AND p.status = '1' 
			AND p.date_available <= NOW() 
		");
		return $query->row['min_price'];
	}
              
	public function getProductMinSpecial($product_id) {
		$query = $this->db->query(
			"SELECT MIN(ps.price) as min_special
			FROM  ". DB_PREFIX . "product_related2 pr 
			LEFT JOIN " . DB_PREFIX . "product p ON (pr.related_id = p.product_id) 
			LEFT JOIN " . DB_PREFIX . "product_special ps ON (p.product_id = ps.product_id) 
			WHERE pr.product_id = '" . (int)$product_id . "'
			AND p.price > '0' 
			AND p.status = '1' 
			AND p.date_available <= NOW() 
		");
		return $query->row['min_special'];
	}

1) Получил Минимальную бозовую цену
2) Получил минимальную special цену

Как выбрать special цену продукта у которого я дастал бозовую цену... Это не пониаю

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


8 минут назад, chukcha сказал:

Нет учета групп дат приоритетов


Это имеете ввиду?

AND ps.customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "' 
AND ((ps.date_start = '0000-00-00' 
OR ps.date_start < NOW()) 
AND (ps.date_end = '0000-00-00' 
OR ps.date_end > NOW())) 

 

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


Я ж говорил что задача не из простых, и простыми запросами не решается


 

SELECT * FROM product

WHERE price = (

SELECT price FROM product p , product_related pr
WHERE pr.product_id = '" . (int)$product_id . "'

AND p.product_id = pr.related_id

ORDER BY price ASC

LIMIT 1)

Таким образом ві получите  ВЕСЬ список товаров с минимальной ценой

Затем, таким же образом вы получаете  минимальную цену товаров с акциями

 

 

 

 

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

public function getProductMinSpecial($product_id) {
	$query = $this->db->query("
		SELECT (ps.price) AS min_special, 
		(SELECT p.price) AS min_price
		FROM " . DB_PREFIX . "product_related2 pr
		LEFT JOIN " . DB_PREFIX . "product p ON ( pr.related_id = p.product_id ) 
		LEFT JOIN " . DB_PREFIX . "product_special ps ON ( p.product_id = ps.product_id ) 
		WHERE pr.product_id = '" . (int)$product_id . "'
		AND ps.product_id =  p.product_id
		AND p.price >  '0'
		AND p.status =  '1'
		AND p.date_available <= NOW( ) 
		AND ps.customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "' 
		AND ((ps.date_start =  '0000-00-00'
		OR ps.date_start < NOW( ))
		AND (ps.date_end =  '0000-00-00'
		OR ps.date_end > NOW( )))
		ORDER BY ps.price ASC
		LIMIT 1
	");

	return $query->row['min_special'];

Такой код достает данные в принципе что мне нужно (2 колонки по 1-ой строке): http://joxi.ru/Rmz5PlGf4500rO

Подскажите как вывести этих 2 значения в 2 разные переменные?

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


48 минут назад, s89 сказал:

public function getProductMinSpecial($product_id) {
	$query = $this->db->query("
		SELECT (ps.price) AS min_special, 
		(SELECT p.price) AS min_price
		FROM " . DB_PREFIX . "product_related2 pr
		LEFT JOIN " . DB_PREFIX . "product p ON ( pr.related_id = p.product_id ) 
		LEFT JOIN " . DB_PREFIX . "product_special ps ON ( p.product_id = ps.product_id ) 
		WHERE pr.product_id = '" . (int)$product_id . "'
		AND ps.product_id =  p.product_id
		AND p.price >  '0'
		AND p.status =  '1'
		AND p.date_available <= NOW( ) 
		AND ps.customer_group_id = '" . (int)$this->config->get('config_customer_group_id') . "' 
		AND ((ps.date_start =  '0000-00-00'
		OR ps.date_start < NOW( ))
		AND (ps.date_end =  '0000-00-00'
		OR ps.date_end > NOW( )))
		ORDER BY ps.price ASC
		LIMIT 1
	");

	return $query->row['min_special'];

Такой код достает данные в принципе что мне нужно (2 колонки по 1-ой строке): http://joxi.ru/Rmz5PlGf4500rO

Подскажите как вывести этих 2 значения в 2 разные переменные?

Фигню вы написали
 

Потому что вы совсем не представляете, какая нагрузка будет на сервер

А будет выполняться для второй столбца  ровно count(realated_id)

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

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

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

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

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

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

Вхід

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

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

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

Important Information

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