리더보드 문제를 해결하기 위해 공동 그룹별로 주문

여기서는 단일 그룹별 또는 단일 순서에 대해 이야기하지 않지만 그룹화 및 정렬 기능을 완료하기 위해 함께 사용되는 경우가 많습니다.

$field = 'id,uid,course_id,평균 점수,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);(2차원 배열을 가로채서 표시)과 결합하면 완전한 리더보드가 준비됩니다.

요약하다! ! ! order by의 열은 group by 절에 나타나야 합니다. 이것은 매우 명백한 진실입니다! ! !

추천

출처blog.csdn.net/qq_58778333/article/details/130320757