简体   繁体   中英

MySQL Joining Table, Find Average Rating, and Rank

How do you calculate the average rating, then order by the highest average rating and number of votes?

Below is what I have so far...

members table

ID | name
---+------
 1 | Andrew
 2 | Anthony
 3 | John
 4 | Jane

member_ratings table

ID | id_gave_rating | id_rated | rating
---+----------------+----------+---------
 1 |        1       |     2    |    1
 2 |        2       |     3    |    4
 3 |        3       |     4    |    3
 4 |        4       |     2    |    5

current query

    $sql = "
    SELECT *, 
    m.id AS id, 
    c1.id AS id_rated, 
    c1.name AS name_rated
    FROM member_ratings AS m
    JOIN members AS c1 ON m.id_rated  = c1.id"; 

Targeted result

id_rated | avg_rating | votes
---------+------------+--------
    3    |      4     |    1
    2    |      3     |    2
    4    |      3     |    1

You must group by id_rated in member_ratings and aggregate:

select id_rated, 
       avg(rating) avg_rating,
       count(*) votes
from member_ratings
group by id_rated
order by avg_rating desc, votes desc

If you want also the details of the member you can join to members :

select m.id, m.name, r.avg_rating, r.votes
from members m 
inner join (
  select id_rated, 
         avg(rating) avg_rating,
         count(*) votes
  from member_ratings
  group by id_rated
) r on r.id_rated = m.id
order by r.avg_rating desc, r.votes desc

Or:

select m.id, m.name, 
       avg(r.rating) avg_rating,
       count(*) votes
from members m inner join member_ratings r
on r.id_rated = m.id
group by m.id, m.name
order by avg_rating desc, votes desc

See the demo .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM