mashkovtsevlx

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

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

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

 

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

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

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


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

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

Изменено пользователем halfhope

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


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

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

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

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


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

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

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

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

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

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

Войти

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

Войти


  • Похожий контент

    • От OlegF
      Всем привет! Нужна помощь тех, кто разбирается в MySQL, поскольку я только начинаю вникать и возникла проблема с запуском сайта http://beesworld-shop.esy.es. Зашел на сайт и обнаружил такую ошибку (см. прикрепленное изображения). Ничего, что могло бы привести к таким последствиям, не делал. Последние время только добавлял фотографии к товарам и все – настройки  и ничего другого не делал.
      Кто подскажет, что можно сделать? Может уже есть готовое решение на форуме, где можно почитать и понемножку разобраться.

       
      Платформа - OpenCart 2.0.1.2
       
      Платформа размещена на - http://hostinger.com.ua
       
      Тариф - бесплатный
       
      Спасибо!!!

    • От perfectpc
      Требуется помощь в выгрузке товара на opencart pro 2.3
      Ситуация такова. Имеются товары (около 2-3 тысяч) с привязками к категориям. Нередки случаи, когда один товар имеет 5000 категорий для подбора товара.
      Либо же консультация по оперативной выгрузке, либо консультация или услуга по объединению двух баз данных с одинаковой структурой.
      Нужна либо платная консультация либо услуга выгрузки.
      Жду предложения на почту или в личку с примерными ценами.
      Ситуация специфическая, готов за платить просто за информацию
    • От VannDogg
      Все привет.
       
      Нужна помощь следующего рода: нужно сформировать запрос в БД для того чтобы отключить отображение товаров определенной категории.
      Проблема в том, что отображение товаров редактируется в таблице oc_product, а связи з категориями - в таблице oc_product_to_category.
      Нужно чтобы запрос проверял product_id на предмет связи с конкретным category_id и назначал status =1. То есть нужен запрос с действием в одну таблицу с проверкой данных их другой... Я в SQL "зелень" потому и нужна помощь...
    • От WebDevYV
      Есть скрипт, который на локальной машине работает корректно, но при установке его на сервер в файл product.tpl (cms OpenCart 2.3.0.2, theme Next Default 3)ничего не происходит. Скрипт берет цену из таблицы с учетом id товара. Ошибок код никаких не выводит. Спасибо за помощь.
      <?php $host = 'хост'; $db = 'имя бд'; $user = 'юзер нейм'; $pass = 'пароль'; $charset = 'utf8'; $dsn = "mysql:host=$host;dbname=$db;charset=$charset"; $opt = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false, ]; $pdo = new PDO($dsn, $user, $pass, $opt); $stmt = $pdo->prepare('SELECT price FROM oc_product WHERE product_id = ?'); $stmt->execute([$_GET['id']]); foreach ($stmt as $row) { echo 'price '.$row['price'] . "\n"; } ?>  
    • От Devorian
      Всем привет, делаю магазин для заказчика.
      Платформа Open Cart 2.3.0
      конфигурация VPS:
      4 core, 8 Gb RAM
      CentOS 6.x
       
      Собственно проблема:
      В магазине 20 тыс товаров. Подсчет товаров в категории отключен, установлен v2 cache модуль. Сжатие выставлено на 8.
       
      При открытии категории на MySQL происходит загрузка одного из ядер на 100% на несколько секунд. Как результат, категория открывается 7-10 секунд. Заказчик, само собой, бесится. Также по базе - см, скриншот. Болезнь показана в динамике.
       
       




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

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