【问题标题】:MySQL Joining Table, Find Average Rating, and RankMySQL 连接表、查找平均评分和排名
【发布时间】:2020-11-29 02:29:00
【问题描述】:

如何计算平均评分,然后按最高平均评分和票数排序?

以下是我目前所拥有的......

members

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

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

当前查询

    $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"; 

目标结果

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

【问题讨论】:

    标签: mysql join count average


    【解决方案1】:

    您必须在member_ratingsgroup by id_rated 并聚合:

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

    如果您还想了解会员的详细信息,您可以加入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
    

    或者:

    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
    

    请参阅demo

    【讨论】:

      猜你喜欢
      • 2012-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-02
      • 2011-10-02
      • 1970-01-01
      相关资源
      最近更新 更多