order by 联合group by解决排行榜问题

单group by 或者单order by这里就不多讲,但是它们常常组合在一起用,完成分组加排序的功能.

$field = 'id,uid,course_id,score as avg,ec_id,examid';
$resultSql = StuExam::where($where)->field($field)->order(['score' => 'desc'])->limit(100000)->buildSql();
$result = Db::table($resultSql . 'stu_exam')
    ->field( 'id,uid,course_id, avg,ec_id,examid')->order(['avg' => 'desc'])
    ->group('uid')->fetchSql()->select();dd($result);

sql语句长这样:

SELECT `id`,`uid`,`course_id`,`avg`,`ec_id`,`examid` FROM ( SELECT `id`,`uid`,`course_id`,score as avg,`ec_id`,`examid` FROM `edu_stu_exam` WHERE  `course_id` = 45  AND `type` = 82 ORDER BY `score` DESC LIMIT 100000 )stu_exam GROUP BY `uid` ORDER BY `avg` DESC

至此我们就完成了功能   多用户多次提交数据  只取每个用户的最大值  并根据分数倒序排列

再搭配上array_slice($arr,0,$num);  (对二维数组进行截取展示)一个完整的排行榜就做好了

总结!!!order by 中列,应该出现在group by 子句中。这是一个很显然的道理!!!

猜你喜欢

转载自blog.csdn.net/qq_58778333/article/details/130320757