【问题标题】:List with artistnames sorted by average rating from MySQL tables从 MySQL 表中按平均评分排序的艺术家姓名列表
【发布时间】:2012-05-28 11:50:02
【问题描述】:

我有这张“评分”表,其中包含一个 USER_ID、Artist_ID 和一个评分(int,用户分配的分数)。当然还有一个“艺术家”表,其中包含一个字段“ID”和“名称”。

我正在尝试获取艺术家姓名的降序列表,按每位艺术家的 AVG 得分排序。一开始我以为这不会那么难,但我一直在摆弄……

这就是我卡住的地方。我必须弄清楚它如何计算多次出现的 id 的 AVG() 。而且我已经使用 DISTINCT 关键字尝试了各种查询,但都没有成功。

例如:

SELECT Name, Rating
FROM Artists as a
INNER JOIN Ratings as r
ON a.ID = r.Artists_ID 
ORDER BY r.Rating DESC;

给我结果:

Name                Rating
"The Mars Volta"    9.5
"Simon Felice"      9.0
"Laura Gibson"      8.0
"Calexico"          7.0
"Mira"              7.0
"Guido Belcanto"    6.0
"Guido Belcanto"    1.0

如您所见,艺术家“Guido Belcanto”的评分超过 1。我目前不知道如何计算不止一次出现的那些 ID 的 AVG()。这可能是基本的 MySQL,但我可能正在寻找错误的方向

【问题讨论】:

    标签: mysql sql rating average


    【解决方案1】:

    您在查询中忘记了GROUP BY 并实际计算了您获得的平均评分(使用AVG 函数):

    SELECT Name, AVG(Rating) AS AVGRating
    FROM Artists as a
    INNER JOIN Ratings as r
        ON a.ID = r.Artists_ID
    GROUP BY Name
    ORDER BY AVGRating DESC;
    

    虽然按艺术家表的键进行分组可能会更好(有足够的数据,有几个同名的艺术家并不是不可想象的)。

    【讨论】:

    • 谢谢! GROUP BY 正是我所需要的
    【解决方案2】:

    按艺术家对评分进行分组,这样您就可以计算每个组的评分平均值,并将其与 Artists 连接以获得与每个 id 关联的名称。

    【讨论】:

      猜你喜欢
      • 2019-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-29
      相关资源
      最近更新 更多