Laravel MySQL查询:获取团队积分排名,返回前2含同分团队
Laravel 查询实现团队积分榜(含同分第二名全部返回)
需求说明
生成团队积分榜,返回积分最高的前2个排名组:
- 积分最高的团队(排名1)必选
- 所有与第二名积分相同的团队全部返回,不受数量限制
- 结果需包含团队ID、名称、积分及对应排名
实现方案(基于MySQL 8.0+)
利用MySQL的DENSE_RANK()窗口函数实现同积分同排名的逻辑,再通过Laravel查询构造器封装:
方式1:CTE写法(Laravel 8+推荐)
$topTeams = DB::table('teams') ->withExpression('ranked_teams', function ($query) { $query->select( 'id', 'name', 'total_points', DB::raw('DENSE_RANK() OVER (ORDER BY total_points DESC) AS `rank`') ); }) ->select('*') ->from('ranked_teams') ->where('rank', '<=', 2) ->get();
方式2:子查询兼容写法
$subQuery = DB::table('teams') ->select( 'id', 'name', 'total_points', DB::raw('DENSE_RANK() OVER (ORDER BY total_points DESC) AS `rank`') ); $topTeams = DB::table($subQuery, 'ranked') ->select('*') ->where('rank', '<=', 2) ->get();
结果验证
针对提供的测试数据,运行代码后会返回以下结果:
| id | name | total_points | rank |
|---|---|---|---|
| 1 | ABC | 250 | 1 |
| 2 | DEF | 120 | 2 |
| 3 | PQR | 120 | 2 |
注意事项
- 需使用MySQL 8.0及以上版本,
DENSE_RANK()窗口函数是8.0版本新增特性 - 若需兼容更低版本MySQL,需用变量手动计算排名,但逻辑较繁琐,建议优先升级数据库版本
内容的提问来源于stack exchange,提问作者Ronak Solanki
相关产品推荐
相关产品推荐

