Andrew
Andrew

Reputation: 148

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

Upvotes: 0

Views: 579

Answers (1)

forpas
forpas

Reputation: 164099

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.

Upvotes: 1

Related Questions