Сортировка по отзывам из двух таблиц

380
13 февраля 2017, 17:33

Помогите пожалуйста разобраться как реализовать сортировку по популярности (отзывам) из двух таблиц. При том чтобы отображались все записи из первой таблицы.

К примеру есть таблица me_cars. При выводе можно менять сортировку (asc, desc):

$order == "desc") {
    $this->db->order_by('me_cars.item_title', 'desc');
}

В примере выше все работает как нужно, все записи (5шт) отображаются и сортируются по заголовку.

Вопрос собственно в том, как можно отсортировать по отзывам, которые находятся в другой таблице me_cars_reviews при этом показать все записи (5шт) из первой таблицы, но учитывая сортировку из второй таблицы?

Таблица me_cars

| item_id |  item_title |
+---------+-------------+
|    1    |  Title item |
+---------+-------------+
|    2    |  Title item |
+---------+-------------+
|    3    |  Title item |
+---------+-------------+
|    4    |  Title item |
+---------+-------------+
|    5    |  Title item |
+---------+-------------+

item_id - ID автомобиля

item_title - название автомобиля

Таблица me_cars_reviews

| review_id | review_itemid | review_overall |
+-----------+---------------+----------------+
|     1     |       4       |       8        |
+-----------+---------------+----------------+
|     2     |       4       |       6        |
+-----------+---------------+----------------+
|     3     |       1       |       7        |
+-----------+---------------+----------------+
|     4     |       4       |       3        |
+-----------+---------------+----------------+
|     5     |       4       |       1        |
+-----------+---------------+----------------+

review_id - ID отзыва

review_itemid - ID автомобиля из первой таблицы

review_overall - оценка

Попробовал сделать так:

$order == "popular") {
    $this->db->select('me_cars.item_id,me_cars_reviews.review_overall,pt_reviews.review_itemid');
    $this->db->select_avg('pt_reviews.review_overall', 'overall');
    $this->db->order_by('overall', 'desc');
    $this->db->group_by('me_cars.item_id');
    $this->db->join('me_cars_reviews', 'me_cars.item_id = me_cars_reviews.review_itemid');
}

При данной реализации все работает (сортирует и отображает), но отображает только те записи которые присутствуют во второй таблице me_cars_reviews, т.е. выводит только 2 записи (где review_itemid = 1 и 4). Пример:

1 запись (4 item_id) (по наибольшим оценкам)

2 запись (1 item_id)

больше ничего не показывает

Необходимо вывести все 5 записей (>) из первой таблицы, но учитывая вторую, т.е. на выходе должно получится так:

1 запись (4 item_id)

2 запись (1 item_id)

3 запись - остальные без отзывов

4 запись - остальные без отзывов

5 запись - остальные без отзывов

и т.д. (если в таблице me_cars больше записей)

p.s. 5 записей просто для примера. В таблице может быть 100, 200 и т.д.

Спасибо.

Answer 1

Можно вот так:

SELECT
  c.`item_title` AS Title,
  COALESCE(SUM(r.`review_overall`),0) AS Overall
FROM
  me_cars AS c
LEFT OUTER JOIN
  me_cars_reviews AS r
  ON c.`item_id` = r.`review_itemid`
GROUP BY
  c.`item_id`
ORDER BY
  Overall DESC

Если "баллы" нужно не сумировать, а просто подсчитать количество оценок - в третей строчке запроса SUM меняем на COUNT.

Чтобы разобраться, почитайте памятку по объединениям - когда-то для себя делал.

Answer 2
SELECT item_title FROM me_cars mc
LEFT JOIN me_cars_reviews mcr ON mc.item_id =  mcr.review_itemid
ORDER BY mcr.review_overall DESC

skillz.ru/dev/php/article-Obyasnenie_SQL_obedinenii_JOIN_INNER_OUTER.html - очень понятная статья о join-ах

READ ALSO
Создание уникального поля

Создание уникального поля

Имеется функция, проблема в том что при INSERT-е если попадается уникальное поля, он выпадает ошибку после нескольких рефрешов инсерт происходитПоле...

303
Кодировка БД в командной строке windows

Кодировка БД в командной строке windows

При запросе данных с БД в командной строке windows кириллица выводится в виде кракозябрПри чем такая проблема исключительно при выводе данных...

303
PHP периодическая ошибка синтексиса

PHP периодическая ошибка синтексиса

Периодически сервер выдаёт такую ошибку:

364
Парсинг больших .csv и добавление в базу

Парсинг больших .csv и добавление в базу

Есть файл, в нем 300000 строк, мне нужно обработать каждую строку, и добавть значение в базу

425