Jump to content
Sign in to follow this  
mashkovtsevlx

[Решено] SQL запрос для получения товаров из категории

Recommended Posts

Здравствуйте. Необходимо вытащить все товары из определенной категории для модуля. 

 

Вот код из модуля. Вытягивает товары с акциями.

if( isset($setting['tabs']['special']) ){
$products = $this->getProducts( $this->model_catalog_product->getProductSpecials( $data ), $setting );
$this->data['heading_title'] = $this->language->get('text_special');
}

Код функции для получения товаров с акциями

public function getProductSpecials($data = array()) {
if ($this->customer->isLogged()) {
$customer_group_id = $this->customer->getCustomerGroupId();
} else {
$customer_group_id = $this->config->get('config_customer_group_id');
}
 
$sql = "SELECT DISTINCT ps.product_id, (SELECT AVG(rating) FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = ps.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating FROM " . DB_PREFIX . "product_special ps LEFT JOIN " . DB_PREFIX . "product p ON (ps.product_id = p.product_id) LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) WHERE p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ps.customer_group_id = '" . (int)$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())) GROUP BY ps.product_id";
 
$sort_data = array(
'pd.name',
'p.model',
'ps.price',
'rating',
'p.sort_order'
);
 
if (isset($data['sort']) && in_array($data['sort'], $sort_data)) {
if ($data['sort'] == 'pd.name' || $data['sort'] == 'p.model') {
$sql .= " ORDER BY LCASE(" . $data['sort'] . ")";
} else {
$sql .= " ORDER BY " . $data['sort'];
}
} else {
$sql .= " ORDER BY p.sort_order";
}
 
if (isset($data['order']) && ($data['order'] == 'DESC')) {
$sql .= " DESC, LCASE(pd.name) DESC";
} else {
$sql .= " ASC, LCASE(pd.name) ASC";
}
 
if (isset($data['start']) || isset($data['limit'])) {
if ($data['start'] < 0) {
$data['start'] = 0;
}
 
if ($data['limit'] < 1) {
$data['limit'] = 20;
}
 
$sql .= " LIMIT " . (int)$data['start'] . "," . (int)$data['limit'];
}
 
$product_data = array();
 
$query = $this->db->query($sql);
 
foreach ($query->rows as $result) {
$product_data[$result['product_id']] = $this->getProduct($result['product_id']);
}
 
return $product_data;
}

 
Необходимо преобразовать код для получения товаров с акциями в код для получения товаров из определенной категории. Код модуля понимаю, но не функции, которая вытягивает товары. Кто поможет, как надо преобразить? Просто заточить под вытягивание из категории с определенным id

Share this post


Link to post
Share on other sites

model_product_product

$this->data['products'] = array();

$data = array(
	'filter_category_id' => $category_id,
	'filter_filter'      => $filter, 
	'sort'               => $sort,
	'order'              => $order,
	'start'              => ($page - 1) * $limit,
	'limit'              => $limit
);
		
$results = $this->model_catalog_product->getProducts($data);
//Вызов метода getFoundProducts должен проводится сразу же после getProducts
//только тогда он выдает правильное значения количества товаров
$product_total = $this->model_catalog_product->getFoundProducts(); 

Выдерните код из категорий


 

UPD: Прошу прощения, не то написал.

 

Вот рабочий SQL код, там добавлен "left join oc_product_to_category p2c ON (p2c.product_id = ps.product_id)" WHERE "p2c.category_id = $data['category_id'] AND".

SELECT DISTINCT ps.product_id, (

SELECT AVG( rating ) 
FROM oc_review r1
WHERE r1.product_id = ps.product_id
AND r1.status =  '1'
GROUP BY r1.product_id
) AS rating
FROM oc_product_special ps
LEFT JOIN oc_product p ON ( ps.product_id = p.product_id ) 
LEFT JOIN oc_product_description pd ON ( p.product_id = pd.product_id ) 
LEFT JOIN oc_product_to_store p2s ON ( p.product_id = p2s.product_id ) 
LEFT JOIN oc_product_to_category p2c ON ( p2c.product_id = ps.product_id ) 
WHERE p2c.category_id =20
AND p.status =  '1'
AND p.date_available <= NOW( ) 
AND p2s.store_id =  '0'
AND ps.customer_group_id =  '1'
AND (
(
ps.date_start =  '0000-00-00'
OR ps.date_start < NOW( )
)
AND (
ps.date_end =  '0000-00-00'
OR ps.date_end > NOW( )
)
)
GROUP BY ps.product_id
ORDER BY LCASE( pd.name ) ASC , LCASE( pd.name ) ASC 
LIMIT 0 , 5

 

Вот готовый PHP:

$sql = "SELECT DISTINCT ps.product_id, (SELECT AVG(rating) FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = ps.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating FROM " . DB_PREFIX . "product_special ps LEFT JOIN " . DB_PREFIX . "product p ON (ps.product_id = p.product_id) LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN ".DB_PREFIX."product_to_category p2c ON (p2c.product_id = ps.product_id) WHERE p2c.category_id = '" . (int)$data['category_id'] . "' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ps.customer_group_id = '" . (int)$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())) GROUP BY ps.product_id";
 

 

Когда вставите, то передавайте в функцию getProductSpecials() массив $data, в котором $data['category_id'] = $category_id

Edited by halfhope

Share this post


Link to post
Share on other sites

model_product_product

$this->data['products'] = array();

$data = array(
	'filter_category_id' => $category_id,
	'filter_filter'      => $filter, 
	'sort'               => $sort,
	'order'              => $order,
	'start'              => ($page - 1) * $limit,
	'limit'              => $limit
);
		
$results = $this->model_catalog_product->getProducts($data);
//Вызов метода getFoundProducts должен проводится сразу же после getProducts
//только тогда он выдает правильное значения количества товаров
$product_total = $this->model_catalog_product->getFoundProducts(); 

Выдерните код из категорий

 

UPD: Прошу прощения, не то написал.

 

Вот рабочий SQL код, там добавлен "left join oc_product_to_category p2c ON (p2c.product_id = ps.product_id)" WHERE "p2c.category_id = $data['category_id'] AND".

SELECT DISTINCT ps.product_id, (

SELECT AVG( rating ) 
FROM oc_review r1
WHERE r1.product_id = ps.product_id
AND r1.status =  '1'
GROUP BY r1.product_id
) AS rating
FROM oc_product_special ps
LEFT JOIN oc_product p ON ( ps.product_id = p.product_id ) 
LEFT JOIN oc_product_description pd ON ( p.product_id = pd.product_id ) 
LEFT JOIN oc_product_to_store p2s ON ( p.product_id = p2s.product_id ) 
LEFT JOIN oc_product_to_category p2c ON ( p2c.product_id = ps.product_id ) 
WHERE p2c.category_id =20
AND p.status =  '1'
AND p.date_available <= NOW( ) 
AND p2s.store_id =  '0'
AND ps.customer_group_id =  '1'
AND (
(
ps.date_start =  '0000-00-00'
OR ps.date_start < NOW( )
)
AND (
ps.date_end =  '0000-00-00'
OR ps.date_end > NOW( )
)
)
GROUP BY ps.product_id
ORDER BY LCASE( pd.name ) ASC , LCASE( pd.name ) ASC 
LIMIT 0 , 5

 

Вот готовый PHP:

$sql = "SELECT DISTINCT ps.product_id, (SELECT AVG(rating) FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = ps.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating FROM " . DB_PREFIX . "product_special ps LEFT JOIN " . DB_PREFIX . "product p ON (ps.product_id = p.product_id) LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN ".DB_PREFIX."product_to_category p2c ON (p2c.product_id = ps.product_id) WHERE p2c.category_id = '" . (int)$data['category_id'] . "' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ps.customer_group_id = '" . (int)$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())) GROUP BY ps.product_id";
 

 

Когда вставите, то передавайте в функцию getProductSpecials() массив $data, в котором $data['category_id'] = $category_id

Разобрался сам, но все же спасибо большое!

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  

  • Similar Content

    • By fduw
      Как подключить mysql через unix socket?
      В инете не нашел рабочей инфы
       
      Стандартная конфа

       Так не работает
      define('DB_HOSTNAME', 'unix:/tmp/mysql.sock'); define('DB_HOSTNAME', 'localhost/tmp/mysql.sock'); define('DB_HOSTNAME', 'tmp/mysql.sock');  
    • By perebor
      Ребят привет, нужна помощь, прошу не пинаться) я пока не силен в оптимизации БД, но очень интересно было бы разобраться самому.
      На сервере где-то раз в месяц происходят скачки по нагрузке и кол-ву запросов. Последний был 27 числа, админка при этом пару раз отдавала 503 ошибку. Хостинг шлет предупреждения.
      Есть лог запросов, но все, что пока понимаю, так это то, что основную нагрузку подбрасывают запросы из мегафильтра. Собственно вопрос в том, что бы понять что это за запросы и как это дело оптимизировать, или может вообще стоит хостинг сменить. Буду благодарен если направите в правильное русло)

      сайт: nice-office.ru
      хостинг: ihc.ru
      Slow log:
       
       

    • By Tinyled
      Добрый день, столкнулся с задачей, выборки данных из таблицы в бд
      сама задача состоит в том что бы получить из таблицы записи сгруппированные по телефону (phone), но перед этим отсортированные по дате (datetime DESC), при этом с лимитом в 200 записей (LIMIT 0,200)
      прошу помочь понять, как можно сформировать запрос к бд, дабы не нагружать сильно бд, и выполнить все условия.
      Или может быть я ошибаюсь, и конечную сортировку лучше делать на php?
      пробовал запросом 
      SELECT sends.* FROM (SELECT * FROM `oc_watsappchat_send` WHERE creator="" ORDER BY `id` DESC) as sends GROUP BY sends.phone ORDER BY `id` DESC LIMIT 0,200 но запрос выходит достаточно долгим, и как я понимаю при увеличении числа записей в таблице время будет также увеличиваться
    • By YaroslavFrolov
      Доброго времени суток. Помогите плиз, нужно данные из корзины вставить в письмо заказа. Обработчик не от опенкарт.
    • By TerranXXX
      Необходимо модифицировать CMS ocStore v2.3 (русский OpenCart 2.1) для работы с MS SQL Server 2012+.

      Обязательные требования:
      1. Взаимодействие CMS с БД должно происходить исключительно через хранимые процедуры (доступа к таблицам у CMS не будет)
      2. Часть логики из php нужно перенести в хранимые процедуры (например динамическое формирование запросов)

      В ответе сообщите срок и стоимость данной работы.
  • 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.