복붙노트

[SQL] MySQL의에서 결과를 순위 때 어떻게 넥타이를 처리합니까?

SQL

MySQL의에서 결과를 순위 때 어떻게 넥타이를 처리합니까?

어떻게 핸들 관계는 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

알 에이미는 같은 등급을 가지고 있지만, 하나는 다른보다 높은 위를 기록하고 있습니다. 에이미는 찢어 오프있어. 어떻게 그렇게 둘은 또한 1의 순위를 가지고, 윌리엄과 메리는 시험을하지 않았다, 그렇게 에이미와 알이 같은 순위 있다고 할 수 있습니다. 그들은 클래스를 체포하고 소년의 방에 흡연되었다. 그들은 마지막 장소를 연결해야합니다.

정확한 순위는해야한다 :

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

사람이 어떤 조언이 있다면 알려 주시기 바랍니다.

해결법

  1. ==============================

    1.편집 : 이것은 MySQL의입니다 4.1 지원

    편집 : 이것은 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
    

    당신은 선언하고 별도의 SET 문을 사용하지 않고 변수를 사용하는 (MySQL의에서, 내부는 어떤 기준없이 가입) 크로스 조인을 사용할 수 있습니다.

    당신은 제대로 널 (null)을 처리 할 수 ​​COALESCE이 필요합니다.

  2. ==============================

    2.더 나은 데이터베이스와 클라이언트 사이에 앉아 코드로 표현 될 미들웨어 규칙처럼 들린다.

    더 나은 데이터베이스와 클라이언트 사이에 앉아 코드로 표현 될 미들웨어 규칙처럼 들린다.

    그게 가능하지, 난 당신이 그것을 쓴 쿼리를 실행 한 다음 커서 및 배열을 사용하여 결과를 수정하기 위해 MySQL은 저장 프로 시저를 권 해드립니다.

  3. from https://stackoverflow.com/questions/2474390/how-do-i-handle-ties-when-ranking-results-in-mysql by cc-by-sa and MIT license