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

Помогите сделать SQL-запрос для похожих товаров

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

Хочу сделать автоматический выбор похожих товаров в файле /catalog/model/catalog/product.php

Добавил в функцию public function getProductRelated($product_id) следующий код:

(код взял из http://www.opencart.com/index.php?route=extension/extension/info&extension_id=14277&filter_search=Auto%20Related)

 

$max_related = 2;

$num_related = $max_related - count($product_data);
if($num_related > 0)
{
$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) WHERE p.manufacturer_id IN (SELECT manufacturer_id FROM " . DB_PREFIX . "product WHERE product_id = '" . (int)$product_id . "') AND p.product_id != '" . (int)$product_id . "' AND p.status = '1' AND p.quantity > 0 AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' ORDER BY RAND() LIMIT 0," . $num_related);

foreach ($query->rows as $result) {
$product_data[$result['product_id']] = $this->getProduct($result['product_id']);
}
}
$max_related = 6;

$num_related = $max_related - count($product_data);
if($num_related > 0)
{

$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_to_category p2c LEFT JOIN " . DB_PREFIX . "product p ON (p2c.product_id = p.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) WHERE p2c.category_id IN (SELECT category_id FROM " . DB_PREFIX . "product_to_category WHERE product_id = '" . (int)$product_id . "') AND p.product_id != '" . (int)$product_id . "' AND p.status = '1' AND p.quantity > 0 AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' ORDER BY RAND() LIMIT 0," . $num_related);

foreach ($query->rows as $result)
$product_data[$result['product_id']] = $this->getProduct($result['product_id']);

return $product_data;
}
 

 

Теперь выводятся 2 товара того же производителя и еще 4 из категории товара.

 

Мне нужно, чтобы выводились:

2 товара того же производителя, из той же категории и близкие по цене

4 товара из той же категории близкие по цене

 

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

Заранее благодарю!

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


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

Подниму. Помогите, пожалуйста.

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


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

Написать за вас запросы?

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


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

Если честно - да. Я худо-бедно разобрался с PHP, но SQL для меня дремучий лес, хотя я просмотрел уже какие только можно готовые запросы, чтобы уловить семантику языка. :)

PS. Действительно извиняюсь за потребительский подход.

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


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

Ок... давайте вместе

SELECT *
FROM " . DB_PREFIX . "product p
LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id)
WHERE p.manufacturer_id IN (SELECT manufacturer_id FROM " . DB_PREFIX . "product WHERE product_id = '" . (int)$product_id . "')
AND p.product_id != '" . (int)$product_id . "'
AND p.status = '1'
AND p.quantity > 0 AND p.date_available <= NOW()
AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "'
ORDER BY RAND() LIMIT 0," . $num_related);

Этим запросом  Вы получили 2 ($num_related) товара, от одного производителя

 

Далее, вам нужно получить  список категорий, в которых находится товар

SELECT pc.category_id
FROM `oc_product_to_category` pc
WHERE pc.product_id = ' . (int)$product_id . '

теперь получим товары, которые в этих категориях

SELECT * 
FROM oc_product p
JOIN `oc_product_to_category` p_t_c on p.product_id = p_t_c.product_id
WHERE p.product_id != ' . $product_id . '
AND p_t_c.category_id in (
       SELECT pc.category_id
       FROM `oc_product_to_category` pc
       WHERE pc.product_id = ' . (int)$product_id . ')
AND p.price between  "цена продукта - что-то" and "цена продукта + что-то"
ORDER BY RAND() LIMIT 0," . $num_related);

Не забываем привязать к магазину

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


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

Ок... давайте вместе

SELECT *
FROM " . DB_PREFIX . "product p
LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id)
WHERE p.manufacturer_id IN (SELECT manufacturer_id FROM " . DB_PREFIX . "product WHERE product_id = '" . (int)$product_id . "')
AND p.product_id != '" . (int)$product_id . "'
AND p.status = '1'
AND p.quantity > 0 AND p.date_available <= NOW()
AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "'
ORDER BY RAND() LIMIT 0," . $num_related);
Этим запросом  Вы получили 2 ($num_related) товара, от одного производителя

 

Далее, вам нужно получить  список категорий, в которых находится товар

SELECT pc.category_id
FROM `oc_product_to_category` pc
WHERE pc.product_id = ' . (int)$product_id . '
теперь получим товары, которые в этих категориях

SELECT * 
FROM oc_product p
JOIN `oc_product_to_category` p_t_c on p.product_id = p_t_c.product_id
WHERE p.product_id != ' . $product_id . '
AND p_t_c.category_id in (
       SELECT pc.category_id
       FROM `oc_product_to_category` pc
       WHERE pc.product_id = ' . (int)$product_id . ')
AND p.price between  "цена продукта - что-то" and "цена продукта + что-то"
ORDER BY RAND() LIMIT 0," . $num_related);
Не забываем привязать к магазину

 

Начну с конца. Про привязку к магазину - вы, очевидно, о

AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "'

Я не могу пока понять принцип использования оператора JOIN, так что не весь ваш код разобрал.

 

Я взял второй запрос из моего файла и дописал в него условие совпадения производителя:

SELECT * FROM " . DB_PREFIX . "product_to_category p2c 
LEFT JOIN " . DB_PREFIX . "product p 
ON (p2c.product_id = p.product_id) 
LEFT JOIN " . DB_PREFIX . "product_to_store p2s 
ON (p.product_id = p2s.product_id) 
WHERE p2c.category_id IN (SELECT category_id FROM " . DB_PREFIX . "product_to_category WHERE product_id = '" . (int)$product_id . "')
AND p.manufacturer_id IN (SELECT manufacturer_id FROM " . DB_PREFIX . "product WHERE product_id = '" . (int)$product_id . "') 
AND p.product_id != '" . (int)$product_id . "' 
AND p.status = '1' 
AND p.quantity > 0 
AND p.date_available <= NOW() 
AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' 
ORDER BY RAND() LIMIT 0," . $num_related

Правильно? Вроде бы работает, но я, как вы понимаете, не уверен в своем колдунстве.

 

Как я могу получить цену товара? Брать как-то из базы или подставлять переменную через PHP? Как сделать вычитание определенного процента от цены? Дописать "-PRICE*0.1"?

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


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

1. Вы должны получить информацию о товаре

id, price и может еще что-то

 

2.

AND p.price between ". $price*0.9 and $price*1.1

 

Как-то так

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


Ссылка на сообщение
Поделиться на другие сайты
Я взял второй запрос из моего файла и дописал в него условие совпадения производителя:

 

Вы возьмите мой запрос и допилите.

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


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

1. Вы должны получить информацию о товаре

id, price и может еще что-то

 

2.

AND p.price between ". $price*0.9 and $price*1.1

 

Как-то так

К сожалению, я не сумел составить запрос, чтобы получить цену. Но в любом случае спасибо вам за помощь!

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

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

×

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

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