Помогите пожалуйста разобраться как реализовать сортировку по популярности (отзывам) из двух таблиц. При том чтобы отображались все записи из первой таблицы.
К примеру есть таблица 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 и т.д.
Спасибо.
Можно вот так:
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
.
Чтобы разобраться, почитайте памятку по объединениям - когда-то для себя делал.
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-ах
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Имеется функция, проблема в том что при INSERT-е если попадается уникальное поля, он выпадает ошибку после нескольких рефрешов инсерт происходитПоле...
При запросе данных с БД в командной строке windows кириллица выводится в виде кракозябрПри чем такая проблема исключительно при выводе данных...
Есть файл, в нем 300000 строк, мне нужно обработать каждую строку, и добавть значение в базу