문제

순위를 매기면 MySQL 쿼리가 발생할 때 어떻게 유대를 처리합니까? 이 예에서 테이블 이름과 열을 단순화했지만 내 문제를 설명해야합니다.

SET @rank=0;

   SELECT student_names.students, 
          @rank := @rank +1 AS rank, 
          scores.grades
     FROM student_names  
LEFT JOIN scores ON student_names.students = scores.students
 ORDER BY scores.grades DESC

따라서 위의 쿼리가 생성된다고 상상해보십시오.

Students  Rank  Grades
=======================
Al         1     90
Amy        2     90
George     3     78
Bob        4     73
Mary       5     NULL
William    6     NULL

Al과 Amy는 같은 등급을 가지고 있지만 하나는 다른 등급보다 높습니다. 에이미는 찢어졌다. 에이미와 알이 동일한 순위를 가질 수 있도록 어떻게 만들 수 있습니까? 또한 둘 다 1 등급을 가질 수 있습니다. 또한 윌리엄과 메리는 테스트를하지 않았습니다. 그들은 수업을 마시고 소년의 방에서 담배를 피우고있었습니다. 그들은 마지막 장소에 묶여 있어야합니다.

올바른 순위는 다음과 같습니다.

Students  Rank  Grades
========================
Al         1     90
Amy        1     90
George     2     78
Bob        3     73
Mary       4     NULL
William    4     NULL

누구든지 조언이 있으면 알려주십시오.

도움이 되었습니까?

해결책

편집하다: 이것은 MySQL 4.1+가 지원됩니다

사용:

   SELECT st.name,
          sc.grades,
          CASE 
            WHEN @grade = COALESCE(sc.grades, 0) THEN @rownum 
            ELSE @rownum := @rownum + 1 
          END AS rank,
          @grade := COALESCE(sc.grades, 0)
     FROM STUDENTS st
LEFT JOIN SCORES sc ON sc.student_id = st.id
     JOIN (SELECT @rownum := 0, @grade := NULL) r
 ORDER BY sc.grades DESC

크로스 조인 (MySQL, 기준이없는 내부 조인)을 사용하여 별도를 사용하지 않고 변수를 선언하고 사용할 수 있습니다. SET 성명.

널을 올바르게 처리하려면 Coalesce가 필요합니다.

다른 팁

데이터베이스와 클라이언트 사이에 앉아있는 코드로 더 잘 표현되는 미들웨어 규칙처럼 들립니다.

가능하지 않은 경우 MySQL에 저장된 절차를 권장하여 쿼리를 작성한 다음 커서와 배열을 사용하여 결과를 수정합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top