Перейти к содержанию
s89

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

Рекомендуемые сообщения

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

К товару прикреплены рекомендуемые товары (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:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
SELECT 
MIN(IFNULL(ps.price,p.price)) AS min_price,
IFNULL(ps.price,p.price) as base_price

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

@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)

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

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

 

 

 

 

  • +1 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 разные переменные?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

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

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

 

налицо нежелание открыть книжку про php :)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
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 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.