Перейти к содержанию
alexxxus

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

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

Добрый день.

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

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, на самом деле не только "очень даже обойтись", но и изобретать особо ничего не надо Изображение

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) {
		...
		...

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

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

  • +1 2

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


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

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

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


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

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

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


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

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

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

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


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

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

Получилось, правда, не сразу разглядел как модифицировать запрос :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 . "')";

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

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


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

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

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

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


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

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

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

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


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

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

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


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

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

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

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

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

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

Войти

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

Войти

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

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

×