Lax*_*idi 7 mysql sql rank window-functions
在对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
Run Code Online (Sandbox Code Playgroud)
所以想象一下上面的查询产生:
Students Rank Grades
=======================
Al 1 90
Amy 2 90
George 3 78
Bob 4 73
Mary 5 NULL
William 6 NULL
Run Code Online (Sandbox Code Playgroud)
虽然Al和Amy的成绩相同,但其中一个排名高于另一个.艾米被扯掉了.我怎样才能让艾米和艾尔拥有相同的排名,这样他们的排名都是1.另外,威廉和玛丽没有参加考试.他们上课并在男孩的房间里吸烟.他们应该并列最后一个位置.
正确的排名应该是:
Students Rank Grades
========================
Al 1 90
Amy 1 90
George 2 78
Bob 3 73
Mary 4 NULL
William 4 NULL
Run Code Online (Sandbox Code Playgroud)
如果有人有任何建议,请告诉我.
OMG*_*ies 16
编辑:这是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
Run Code Online (Sandbox Code Playgroud)
您可以使用交叉连接(在MySQL中,没有任何条件的INNER JOIN)来声明和使用变量,而无需使用单独的SET语句.
您需要COALESCE来正确处理NULL.