Reputation: 148
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
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