单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); (对二维数组进行截取展示)一个完整的排行榜就做好了