Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

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


alexxxus

Recommended Posts

Добрый день.

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

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
Надіслати
Поділитися на інших сайтах

  • 1 month later...

а чем грозит при добавлении товара ставить 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 year later...

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

Надіслати
Поділитися на інших сайтах


Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.