查找平均评分最高的rateable_id - MySQL Rating表查询需求
如何找出平均评分最高的rateable_id(MySQL/Eloquent实现)
没问题,我来帮你搞定这个需求!针对你的Rating表,我分别用原生MySQL和Laravel Eloquent两种方式来实现,你可以根据自己的场景选择:
原生MySQL实现
场景1:只需要返回一个平均分最高的rateable_id
如果你的业务里只需要拿到任意一个最高分的记录(比如即使有多个并列第一,只取第一个),用这个简单的查询就够了:
SELECT rateable_id, AVG(rating) AS average_rating FROM Rating GROUP BY rateable_id ORDER BY average_rating DESC LIMIT 1;
逻辑很清晰:先按rateable_id分组,计算每组的平均评分;接着按平均分从高到低排序;最后用LIMIT 1取排名第一的结果,就像你示例里的rateable_id=26会被优先返回。
场景2:返回所有平均分并列最高的rateable_id
如果存在多个rateable_id的平均分相同且都是最高分,你想把它们都找出来,就需要用子查询来实现:
SELECT rateable_id, AVG(rating) AS average_rating FROM Rating GROUP BY rateable_id HAVING AVG(rating) = ( SELECT MAX(average_rating) FROM ( SELECT AVG(rating) AS average_rating FROM Rating GROUP BY rateable_id ) AS subquery );
这个查询的思路是:先通过内层子查询算出所有rateable_id的平均分,再取这些平均分里的最大值;最后在外层筛选出平均分等于这个最大值的所有分组,这样就能拿到所有并列第一的记录了。
Laravel Eloquent实现
如果你用的是Laravel框架,用Eloquent ORM可以更贴合你的代码风格:
场景1:只取一个最高分记录
$topRated = Rating::select('rateable_id', \DB::raw('AVG(rating) as average_rating')) ->groupBy('rateable_id') ->orderByDesc('average_rating') ->first();
这里用DB::raw()来处理AVG(rating)聚合函数,分组后倒序排序,最后用first()获取第一条结果。
场景2:获取所有并列最高分的记录
// 第一步:先算出所有分组中的最高平均分 $maxAverage = Rating::select(\DB::raw('AVG(rating) as average_rating')) ->groupBy('rateable_id') ->max('average_rating'); // 第二步:筛选出平均分等于最高值的所有记录 $topRatedItems = Rating::select('rateable_id', \DB::raw('AVG(rating) as average_rating')) ->groupBy('rateable_id') ->having('average_rating', $maxAverage) ->get();
先通过max()方法拿到最高平均分,再用having条件筛选出所有符合的分组,最后用get()获取集合。
内容的提问来源于stack exchange,提问作者Parajuli Sunil
相关产品推荐
相关产品推荐

