首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MySQL中对结果进行排名时,如何处理平局?

在MySQL中对结果进行排名时,如何处理平局?
EN

Stack Overflow用户
提问于 2010-03-19 09:05:39
回答 2查看 3.3K关注 0票数 7

如何在mysql查询中对结果进行排名时处理平局?我简化了本例中的表名和列,但它应该说明我的问题:

代码语言:javascript
复制
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

因此,想象一下上面的查询产生的结果:

代码语言:javascript
复制
Students  Rank  Grades
=======================
Al         1     90
Amy        2     90
George     3     78
Bob        4     73
Mary       5     NULL
William    6     NULL

尽管艾尔和艾米的成绩相同,但其中一个的排名比另一个高。艾米被骗了。我怎样才能让艾米和艾尔有相同的排名,这样他们的排名都是1。而且,威廉和玛丽没有参加考试。他们匆忙上课,在男孩子的房间里吸烟。他们应该并列最后一名。

正确的排名应该是:

代码语言:javascript
复制
Students  Rank  Grades
========================
Al         1     90
Amy        1     90
George     2     78
Bob        3     73
Mary       4     NULL
William    4     NULL

如果有人有任何建议,请让我知道。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-03-19 09:30:35

编辑:这是MySQL 4.1+支持的

使用:

代码语言:javascript
复制
   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。

票数 16
EN

Stack Overflow用户

发布于 2010-03-19 09:07:19

听起来像是一个中间件规则,最好用位于数据库和客户端之间的代码来表达。

如果这是不可能的,我建议在MySQL中使用一个存储过程来运行您编写的查询,然后使用游标和数组修改结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2474390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档