如何处理领带当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和艾米具有相同的等级,一个是比另一个排名更高。艾米被炸成了断。我怎样才能让这个艾米和铝的排名相同,所以它们都拥有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