Jump to content
Sign in to follow this  
lavka

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

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 товара из той же категории близкие по цене

 

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

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"?

Share this post


Link to post
Share on other sites

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

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

 

2.

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

 

Как-то так

Share this post


Link to post
Share on other sites
Я взял второй запрос из моего файла и дописал в него условие совпадения производителя:

 

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

Share this post


Link to post
Share on other sites

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

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

 

2.

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

 

Как-то так

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
You are posting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.