简体   繁体   English

MySQL 加入表,查找平均评分和排名

[英]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 members

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

member_ratings table member_ratings

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:您必须在 member_ratings 中group by id_rated member_ratings并聚合:

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 :如果您还想要会员的详细信息,您可以加入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 .请参阅演示

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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