2010-03-19 8 views
7

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 

을 알 에이미가 같은 경우에도 하나는 다른 등급보다 높은 등급입니다. 에이미가 찢어 졌어. Amy와 Al의 순위가 같아서 둘 다 순위가 1 위가되도록하려면 어떻게해야합니까? 또한 William과 Mary는 테스트를하지 않았습니다. 그들은 수업을 포기하고 소년 방에서 담배를 피웠다. 그들은 마지막 장소에 묶여 있어야합니다.

정확한 순위는해야한다 : 사람이 어떤 조언을 가지고

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

있으면 알려 주시기 바랍니다.

답변

16

편집 :이 지원되는 4.1 MySQL의입니다

사용 :

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 문을 사용하지 않아도됩니다.

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

+0

안녕 OMG Ponies, 당신은 MySQL 터미네이터입니다 !! 굉장, 도와 줘서 고마워. 나는 결코 그것을 이해하지 못했을 것이다. (내 SQL 지식은 기본이므로 더 잘 이해하려면 대답을 연구해야합니다.) 또한 화면 이름이 마음에 듭니다. 다시 고맙습니다 !!! -Laxmidi – Laxmidi

+0

"MySQL에서는 조건없이 INNER JOIN을 사용하여 별도의 SET 문을 사용하지 않고 변수를 선언하고 사용할 수 있습니다." 젠장, 네가 할 수 있을지 모르겠다. +1 – heisenberg

+0

내가 할 수만 있다면 다시 투표 할 수 있습니다. 장관. – duffymo

1

데이터베이스와 클라이언트 사이에 위치하는 코드에서 더 잘 표현 될 수있는 미들웨어 규칙과 유사합니다.

그럴 수 없다면 작성한 쿼리를 실행하고 커서와 배열을 사용하여 결과를 수정하려면 MySQL의 저장 프로 시저를 권합니다.

+0

안녕하세요, 의견을 보내 주셔서 감사합니다. 도움에 감사드립니다. -Laxmidi – Laxmidi

+0

OMG Ponies는이 사람입니다. 대단한 대답입니다. – duffymo