如何在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存储过程运行查询,你写的,然后使用游标和数组修改的结果。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top