SQL: выберите записи с наибольшим количеством «обзоров», а затем отсортируйте результаты по наивысшей средней их оценке. - PullRequest
0 голосов
/ 02 августа 2020

У меня есть следующий код:

select
  count(restaurants.id) as restaurant_count,
  `restaurants`.*,
  round(AVG(restaurant_reviews.rate), 1) as rate
from
  `restaurants`
  inner join `restaurant_reviews` on `restaurant_reviews`.`restaurant_id` = `restaurants`.`id`
group by
  `restaurants`.`id`
order by
  `restaurant_count` desc
limit
  3

Это возвращает мне что-то вроде этого:

restaurant_count, id,     name     , rate
      25        , 12, Restaurant 12, 4.6
      22        , 08, Restaurant 08, 4.1
      17        , 19, Restaurant 19, 4.4

Это означает, что он возвращает 3 лучших ресторана с наибольшим количеством restaurant_reviews (количество отзывов отображается в restaurant_count). Я хотел бы после этого упорядочить эти результаты по скорости в порядке убывания. Пример:

restaurant_count, id,     name     , rate
      25        , 12, Restaurant 12, 4.6
      17        , 19, Restaurant 19, 4.4
      22        , 08, Restaurant 08, 4.1

Как я мог это сделать? Я написал все в SQL, но конструктор запросов laravel также приветствуется.

Я пробовал просто изменить order by на:

order by
  `restaurant_count` desc,
  `rate` desc
limit
  3

Но сначала он будет заказывать restaurant_count, и после этого будут упорядочены только те записи, которые имеют такое же количество restaurant_count, по ставке. Это означает, что каждый ресторан с самым большим restaurant_count всегда будет занимать более высокую позицию, независимо от его рейтинга. И это проблема.

1 Ответ

2 голосов
/ 02 августа 2020

Используйте подзапрос:

select r.*
from (select count(*) as review_count, r.*, round(avg(rr.rate), 1) as rate
      from restaurants r join
           restaurant_reviews rr
           on rr.restaurant_id = r.id
      group by r.id
      order by review_count desc
      limit 3
     ) r
order by rate desc;
...