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

使用Laravel查询2017学年1学期文科学生各科考试排名

解决Laravel中学生科目标排名的需求

嘿,我来帮你搞定这个需求!要筛选出指定条件的学生数据并计算每位学生的各科排名,咱们可以利用SQL的窗口函数结合Laravel的查询构造器或者Eloquent来实现,具体步骤如下:

第一步:基础筛选+科目排名查询

首先,我们需要从results表中筛选出Programmes = 'Art'、Year = 2017且Term = 1的数据,同时通过RANK()窗口函数按每个科目对学生分数进行降序排名(分数越高排名越靠前)。

使用DB查询构造器的示例:

$rankedResults = DB::table('results')
    ->select([
        'ID',
        'Reg Number',
        'Name',
        'Subjects',
        'Programmes',
        'Year',
        'Term',
        'score',
        // 按科目分组,分数降序排名
        DB::raw('RANK() OVER (PARTITION BY Subjects ORDER BY score DESC) AS subject_rank')
    ])
    ->where('Programmes', 'Art')
    ->where('Year', 2017)
    ->where('Term', 1)
    ->get();

使用Eloquent模型的示例(假设模型为Result):

use App\Models\Result;

$rankedResults = Result::select([
    'ID',
    'Reg Number',
    'Name',
    'Subjects',
    'Programmes',
    'Year',
    'Term',
    'score',
    DB::raw('RANK() OVER (PARTITION BY Subjects ORDER BY score DESC) AS subject_rank')
])
->where('Programmes', 'Art')
->where('Year', 2017)
->where('Term', 1)
->get();

关于排名规则的说明

  • 如果你希望并列名次不占用后续名次(比如两个第1名之后直接是第2名),可以把RANK()换成DENSE_RANK();
  • 如果你需要严格的连续排名(即使分数相同也按其他字段区分),可以用ROW_NUMBER(),但这种场景下一般用RANK()或DENSE_RANK()更合理。

第二步:整理成学生-科目排名的结构(可选)

如果需要将每个学生的各科排名整合到一行数据中(方便展示),可以通过集合的分组方法来处理:

$studentSubjectRanks = $rankedResults->groupBy('Reg Number')->map(function ($subjectRecords) {
    // 提取学生基础信息
    $baseInfo = $subjectRecords->first()->only([
        'ID', 'Reg Number', 'Name', 'Programmes', 'Year', 'Term'
    ]);
    // 提取各科对应的排名
    $subjectRankMap = $subjectRecords->pluck('subject_rank', 'Subjects');
    
    return array_merge($baseInfo, $subjectRankMap->toArray());
});

这样处理后,每个学生对应一条数据,其中包含了该学生所有科目的排名。

内容的提问来源于stack exchange,提问作者Opoku Debrah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:59:52