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    157

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

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

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


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

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

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

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

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

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

Войти

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

Войти


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

    • От 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 секунд. Заказчик, само собой, бесится. Также по базе - см, скриншот. Болезнь показана в динамике.
       
       




    • От a1exnet
      Ребята, привет,
      У меня в PhpMyAdmin таблицы выходят все очень разбросано, накладываясь друг на друга и связи не отображаются.
      Есть у кого-нибудь диаграмма и схема базы данных MySQL Opencart 2.1.x?
      Как тут:
       
    • От sv2109




      Название: SQL менеджер SQL Buddy
      Добавил: sv2109
      Добавлен: 26 июл 2013
      Категория: Обмен данными
      Метод активации: Без активацииСайт разработчика: sv2109.com
      Ioncube Loader: Нет


      SQL Buddy это простой sql менеджер. Намного проще но и намного легче phpMyAdmin-a
      С помощью него можно:
      создавать базы данных
      создавать, редактировать, удалять таблицы
      изменять структуру таблиц
      изменять данные в таблицах
      выполнять sql запросы
      делать импорт и экспорт таблиц
      итд

      + мульти язычный интерфейс (поддерживает 47 языков включая русский и украинский)
      Перед использованием настоятельно рекомендую сделать копию базы данных!
      Работает на :
      - ocstore 1.5.4.1
      - opencart 1.5.5.1
      но скорее всего будет работать на всех 1.5.x версиях движка
      Возможно вас заинтересуют другие модули автора

      Нажмите здесь, чтобы скачать файл
    • От sv2109
      SQL Buddy это простой sql менеджер. Намного проще но и намного легче phpMyAdmin-a
      С помощью него можно:
      создавать базы данных
      создавать, редактировать, удалять таблицы
      изменять структуру таблиц
      изменять данные в таблицах
      выполнять sql запросы
      делать импорт и экспорт таблиц
      итд

      + мульти язычный интерфейс (поддерживает 47 языков включая русский и украинский)
      Перед использованием настоятельно рекомендую сделать копию базы данных!
      Работает на :
      - ocstore 1.5.4.1
      - opencart 1.5.5.1
      но скорее всего будет работать на всех 1.5.x версиях движка
      Возможно вас заинтересуют другие модули автора
  • Последние посетители   0 пользователей онлайн

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