mysql 写法转laravel方式展现,求每个人相同试卷成绩最好的那条记录,如果最高成绩有相同的,获取最近的那条记录

当前laravel的版本:8.80
功能要求,获取每个人相同试卷考试成绩最好的那条记录,如果最高成绩有相同的,获取最近的那条记录,已经知道怎么用mysql查询,目前用以下代码查询

考试成绩表,user_exam 
| id | papge_id | user_id | score | created_at |  
| -主键- | -试卷id- | -用户id-| -成绩-| -考试日期-|

$ss="SELECT *  FROM ( SELECT rank() OVER(PARTITION BY paper_id, user_id ORDER BY score DESC, created_at DESC) AS r, user_exam.*  FROM user_exam where paper_id=".$id." ) t WHERE t.r = 1";
$data=UserExam::query()->select('user_exam.id','user_exam.user_id','user_exam.score','user_exam.status', 'user_exam.created_at')
                ->join(DB::raw("($ss) as exam"), 'exam.id','=','user_exam.id')
                ->paginate()
            ;

想请问下优化方法或有没有其他方法获取结果,谢谢

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 1
        $examDB = DB::table(DB::select("SELECT rank() OVER(PARTITION BY paper_id, user_id ORDER BY score DESC, created_at DESC) AS r, user_exam.*  FROM user_exam where paper_id={$id}"), 't')->where('t.r', 1);
        $data=User::query()->select('user_exam.id','user_exam.user_id','user_exam.score','user_exam.status', 'user_exam.created_at')
            ->joinSub($examDB, 'exam', 'exam.id','=','user_exam.id')
            ->paginate()
        ;

        // DB::select() 转换成对象, 应该是可以通过
2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!