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

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


lavka

Recommended Posts

Хочу сделать автоматический выбор похожих товаров в файле /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 користувачів

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

×
×
  • Створити...

Important Information

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