alexxxus

Как составить MySQL запрос для выбора...

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

alexxxus    4

Добрый день.

Если я правильно понял - сейчас выбор продуктов из категории делает функция

public function getProductsByCategoryId($category_id, $sort = 'p.sort_order', $order = 'ASC', $start = 0, $limit = 20) {

$sql = "SELECT *, pd.name AS name, p.image, m.name AS manufacturer, ss.name AS stock, (SELECT AVG(r.rating) FROM " . DB_PREFIX . "review r WHERE p.product_id = r.product_id GROUP BY r.product_id) AS rating FROM " . DB_PREFIX . "product p 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 . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) LEFT JOIN " . DB_PREFIX . "stock_status ss ON (p.stock_status_id = ss.stock_status_id) LEFT JOIN " . DB_PREFIX . "product_to_category p2c ON (p.product_id = p2c.product_id) WHERE p.status = '1' AND p.sort_order='0' AND p.date_available <= NOW() AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2c.category_id = '" . (int)$category_id . "'";

..........
.........
.......

Однако, потребовалось отображать все продукты как из текущей категории, так и из ее вложенных категорий.

То есть показать все продукты категории WHERE category_id=25 OR parent_id=25

Подскажите, пожалуйста, как составить запрос к БД? Не ориентируюсь в сложных запросах )

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


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

одним запросом тут не отделаешься

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


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

Fix305, на самом деле не только "очень даже обойтись", но и изобретать особо ничего не надо Изображение

alexxxus, делаете

catalog/model/catalog/product.php
	public function getProductsByCategoryId($category_id, $sort = 'p.sort_order', $order = 'ASC', $start = 0, $limit = 20, $manufacturer_id=0) {
		...
		...
		
		$query = $this->db->query($sql);
		
		$this->w_getProductsByCategoryIdPlusSubcategories($category_id, $sort, $order, $start, 0, $manufacturer_id);
		
		return $query->rows;
	}
	
	/* w - test - start */
	public function w_getProductsByCategoryIdPlusSubcategories($category_id, $sort = 'p.sort_order', $order = 'ASC', $start = 0, $limit = 20, $manufacturer_id=0) {
		$sql = "SELECT p.product_id, pd.name AS name FROM " . DB_PREFIX . "product p 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 . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) LEFT JOIN " . DB_PREFIX . "stock_status ss ON (p.stock_status_id = ss.stock_status_id) LEFT JOIN " . DB_PREFIX . "product_to_category p2c ON (p.product_id = p2c.product_id) WHERE p.status = '1' AND p.date_available <= NOW() AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2c.category_id IN (SELECT category_id FROM " . DB_PREFIX . "category WHERE parent_id = '" . (int)$category_id . "' OR category_id = '" . (int)$category_id . "')";
		
		/* filter by manufacturer id - start */
		if ($manufacturer_id > 0) {
			$sql .= " AND p.manufacturer_id = '".$manufacturer_id."'";
		}
		/* filter by manufacturer id - end */
		
		$sort_data = array(
			'pd.name',
			'p.sort_order',
			'special',
			'rating',
			'p.price',
			'p.model'
		);
		
		if (in_array($sort, $sort_data)) {
			if ($sort == 'pd.name' || $sort == 'p.model') {
				$sql .= " ORDER BY LCASE(" . $sort . ")";
			} else {
				$sql .= " ORDER BY " . $sort;
			}
		} else {
			$sql .= " ORDER BY p.sort_order";
		}
		
		if ($order == 'DESC') {
			$sql .= " DESC";
		} else {
			$sql .= " ASC";
		}
		
		if ($start < 0) {
			$start = 0;
		}
		
		if ($limit > 0) {
			$sql .= " LIMIT " . (int)$start . "," . (int)$limit;
		}
		
		$query = $this->db->query($sql);
		
		if ($query->num_rows) {
			foreach ($query->rows as $row) {
				print "[".$row["product_id"]." -> ".$row["name"]."]<br />";
			}
		}
		//print_r($query->rows);
		//return $query->rows;
	}
	/* w - test - end */
	
	public function getTotalProductsByCategoryId($category_id = 0, $manufacturer_id = 0) {
		...
		...

заходите в категорию, любуетесь "выхлопом" над контентом.

соль, перец - по-вкусу.

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


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

Большое спасибо за решение и потраченное время. Пока не пробывал, но по результатам отпишусь.

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


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

а чем грозит при добавлении товара ставить 2 галочки в верхней категории и в подкатегории ? или это решение для того чтобы 2 галочки не ставить ? ну или массово решить вопрос ?

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


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

а чем грозит при добавлении товара ставить 2 галочки в верхней категории и в подкатегории ? или это решение для того чтобы 2 галочки не ставить ? ну или массово решить вопрос ?

Это не совсем правильно с точки зрения SEO - получается, что на один и тот же товар ведут разные ссылки.

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


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

Только сейчас добрался до этой части в своем магазине. Отпишу, как обещал.

Получилось, правда, не сразу разглядел как модифицировать запрос :rolleyes:

Было в getProductsByCategoryId

$sql = "SELECT *, pd.name AS name, p.image, m.name AS manufacturer, ss.name AS stock, (SELECT AVG(r.rating) FROM " . DB_PREFIX . "review r WHERE p.product_id = r.product_id GROUP BY r.product_id) AS rating FROM " . DB_PREFIX . "product p 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 . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) LEFT JOIN " . DB_PREFIX . "stock_status ss ON (p.stock_status_id = ss.stock_status_id) LEFT JOIN " . DB_PREFIX . "product_to_category p2c ON (p.product_id = p2c.product_id) WHERE p.status = '1' AND p.sort_order='0' AND p.date_available <= NOW() AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2c.category_id = '" . (int)$category_id . "'";

Стало

$sql = "SELECT *, pd.name AS name, p.image, m.name AS manufacturer, ss.name AS stock, (SELECT AVG(r.rating) FROM " . DB_PREFIX . "review r WHERE p.product_id = r.product_id GROUP BY r.product_id) AS rating FROM " . DB_PREFIX . "product p 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 . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) LEFT JOIN " . DB_PREFIX . "stock_status ss ON (p.stock_status_id = ss.stock_status_id) LEFT JOIN " . DB_PREFIX . "product_to_category p2c ON (p.product_id = p2c.product_id) WHERE p.status = '1' AND p.sort_order='0' AND p.date_available <= NOW() AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2c.category_id IN (SELECT category_id FROM " . DB_PREFIX . "category WHERE parent_id = '" . (int)$category_id . "' OR category_id = '" . (int)$category_id . "')";

Аналогичным образом меняется запрос к подсчету общего кол-ва товаров в этих категориях для функции

getTotalProductsByCategoryId($category_id);

Было

$sql = "SELECT COUNT(*) AS total 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 p.status = '1' AND p.sort_order='0' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND p2c.category_id = '" . (int)$category_id . "'";

Стало

$sql = "SELECT COUNT(*) AS total 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 p.status = '1' AND p.sort_order='0' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND p2c.category_id IN (SELECT category_id FROM " . DB_PREFIX . "category WHERE parent_id = '" . (int)$category_id . "' OR category_id = '" . (int)$category_id . "')";

Спасибо за сэкономленное время

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


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

Это не совсем правильно с точки зрения SEO - получается, что на один и тот же товар ведут разные ссылки.

ну это было ранее теперь насколько я вижу после использования seo_url от Ясика такая проблема отпала так как указывается конкретное формирование ссылки но и раньше было такое понятие как каноникал ссылка правда или еще ПС в моем случае не одуплились или они не понимают того что сами рекомендуют :-)

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


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

ну это было ранее теперь насколько я вижу после использования seo_url от Ясика такая проблема отпала так как указывается конкретное формирование ссылки но и раньше было такое понятие как каноникал ссылка правда или еще ПС в моем случае не одуплились или они не понимают того что сами рекомендуют :-)

Каждая ссылка на страницу передаёт ей часть веса... В ситуации с разными ссылками - вес передается не по одной, а по разным ссылкам и я не уверен что поисковики склеят весь переданный вес канонической ссылке...

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


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

А подскажите плизз. я обновляю прайс из 1С и в модуле "новинки" или "последние добавленные" постоянно выводится практически один и тот же товар, а хотелось бы чтобы выводился например товар которого в базе еще не было и он добавился, или иным подходящим вариантом. как составить запрос?

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


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

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

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