Запрос средней оценки - PullRequest
0 голосов
/ 05 мая 2020

У меня есть такая таблица mysql

+--------------+--------+------------+
| restaurantid | rating | customerid |
+--------------+--------+------------+


Я хотел бы найти средний мировой рейтинг только тех ресторанов, которые просмотрел конкретный клиент, используя avg (рейтинг) в sql запрос.

Например:

SELECT avg(rating) FROM ratings WHERE customerid=17. 

Но этот же ресторан будет проверяться и другими. Таким образом, приведенный выше запрос вычисляет среднее значение только по строкам для customerid = 17, а не для учета других людей, которые могли оценить ресторан.

Я бы хотел, чтобы среднее значение было средним для всех клиентов, а не только для клиента №17. Но я бы хотел показать только строки для клиента №17. Один и тот же клиент может проверять один ресторан несколько раз.

Например:

+--------------+--------+------------+
| restaurantid | rating | customerid |
+--------------+--------+------------+
|            1 |      2 |         34 |
|            2 |      3 |         35 |
|            3 |      1 |         17 |
|            4 |      2 |          5 |
|            5 |      2 |         17 |
|            3 |      4 |         17 |
|            8 |      3 |          4 |
|            3 |      5 |         88 |
+--------------+--------+------------+

Теперь я хочу получить (средний рейтинг для всех, кто оценил конкретный ресторан)

+--------------+--------+------------+
| restaurantid | rating | customerid |
+--------------+--------+------------+
|            3 |    3.4 |         17 |
|            5 |      2 |         17 |
+--------------+--------+------------+

Но вот что я получаю (средняя оценка по 2 строкам для 2 оценок ресторана №3, предоставленных клиентом № 17)

+--------------+--------+------------+
| restaurantid | rating | customerid |
+--------------+--------+------------+
|            3 |    2.5 |         17 |
|            5 |      2 |         17 |
+--------------+--------+------------+

Ответы [ 4 ]

0 голосов
/ 05 мая 2020

При простой агрегации после фильтрации restaurantid s:

select restaurantid, 
       avg(rating) rating, 
       17 customerid 
from ratings
where restaurantid in (select restaurantid from ratings where customerid = 17)
group by restaurantid;

См. демонстрацию . Результатов:

| restaurantid | rating | customerid |
| ------------ | ------ | ---------- |
| 3            | 3.3333 | 17         |
| 5            | 2      | 17         |
0 голосов
/ 05 мая 2020
    select restaurantid, avg_rating, 17 as customerid
    from (
             select restaurantid, avg(rating) as avg_rating
             from ratings
             group by restaurantid)
    where restaurantid in (select restaurantid from ratings where customerid = 17);

производит следующий вывод:

    3,3.3333333333333335,17
    5,2,17
0 голосов
/ 05 мая 2020

Попробуйте это

SELECT avg(rating) FROM ratings WHERE customerid=17.

Или вот это

SELECT avg(sum(rating)) FROM ratings WHERE customerid=17.
0 голосов
/ 05 мая 2020

Предполагая, что клиент не просматривает один и тот же ресторан несколько раз, вы можете join и суммировать:

select rc.restaurantid, rc.customerid, avg(r.rating) as other_rating,
       rc.rating as my_rating
from rating r join
     rating rc
     on r.restaurantid = rc.restaurantid
where rc.customerid = 17
group by rc.restaurantid, rc.customerid, rc.rating;

РЕДАКТИРОВАТЬ:

Вы можете обрабатывать несколько отзывов об одном ресторане. путем предварительного агрегирования:

select rc.restaurantid, rc.customerid, avg(r.rating) as other_rating,
       rc.rating as my_rating
from rating r join
     (select restaurantid, avg(rating) as rating
      from rating rc
      group by restuarantid
     ) rc
     on r.restaurantid = rc.restaurantid
where rc.customerid = 17
group by rc.restaurantid, rc.customerid, rc.rating;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...