如何在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如果有人有任何建议,请让我知道。
发布于 2010-03-19 09:30:35
编辑:这是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来正确处理NULL。
发布于 2010-03-19 09:07:19
听起来像是一个中间件规则,最好用位于数据库和客户端之间的代码来表达。
如果这是不可能的,我建议在MySQL中使用一个存储过程来运行您编写的查询,然后使用游标和数组修改结果。
https://stackoverflow.com/questions/2474390
复制相似问题