You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

查找平均评分最高的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:29:08