Сортировка товаров по рейтингу

В HostCMS рейтинг товаров строится на основе среднего значения оценки отзывов к товарам. Соответственно, для того, чтобы реализовать сортировку по оценке нужно сначала получить все отзывы к товару, вычислить среднюю оценку и сортировать по ней. Мне удалось справиться с этой проблемой одним SQL запросом, который был составлен методом проб и ошибок.

SELECT shop_items.* FROM shop_items LEFT JOIN comment_shop_items ON comment_shop_items.shop_item_id = shop_items.id LEFT JOIN comments ON comments.id = comment_shop_items.comment_id GROUP BY shop_items.id ORDER BY IFNULL(AVG(grade), 0) DESC

Далее разместим сортировку по рейтингу вместо стандартной сортировки по названию.

1. Перейдем к коду ТДС интернет-магазина.

2. Находим код

		$sorting == 4 && $Shop_Controller_Show->shopItems()->queryBuilder()
			->clearOrderBy()
			->orderBy('shop_items.name', 'ASC');

		$sorting == 5 && $Shop_Controller_Show->shopItems()->queryBuilder()
			->clearOrderBy()
			->orderBy('shop_items.name', 'DESC');

3. Заменяем на

		if ($sorting == 4 || $sorting == 5)
		{
			$direct = ($sorting == 4)?"DESC":"ASC";

			$Shop_Controller_Show->shopItems()->queryBuilder()
				->clearOrderBy()
				->leftJoin('comment_shop_items', 'comment_shop_items.shop_item_id', '=', 'shop_items.id')
				->leftJoin('comments', 'comments.id', '=', 'comment_shop_items.comment_id', array(
							array('AND' => array('comments.active', '=', 1)),
							array('AND' => array('comments.deleted', '=', 0)),
						)
					)
				->groupBy('shop_items.id')
				->orderBy('IFNULL(AVG(grade), 0)', $direct);
		}

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

comments powered by Disqus


  • Добрый день. Подскажите, а как добавить еще и сортировку по кол-ву отзывов (оценок).
    Сейчас получается так: имеем товар с 100 отзывами и средней оценкой 5 изи 5. И есть товар с 1 отзывом и оценкой 5 из 5. Так вот второй товар встает на первое место, а это не совсем логично.

    • По логике нужно добавить еще одну сортировку, где сортировать по количеству. То есть к тому коду, который в посте добавить еще ->orderBy('count(comments.id)', $direct); этот способ я не проверял, так что возможно потребует некоторой корректировки.

Следующий "Итоги олимпиады по веб-программированию 2015" К списку Предыдущий "Олимпиада по веб-программированию 2015"