MySQL에서 순위를 매길 때 타이를 처리하려면 어떻게해야합니까?
-
21-09-2019 - |
문제
순위를 매기면 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에 저장된 절차를 권장하여 쿼리를 작성한 다음 커서와 배열을 사용하여 결과를 수정합니다.
제휴하지 않습니다 StackOverflow