当前位置: 首页 > 面试题库 >

在MySQL中对结果进行排名时如何处理关系?

戚建德
2023-03-14
问题内容

在对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和Amy的成绩相同,一个人的排名也比另一个高。艾米被偷走了。我如何才能使Amy和Al具有相同的排名,以使他们俩的排名都为1。而且,William和Mary没有参加考试。他们挤在教室里,在男孩的房间里抽烟。他们应该并列最后的位置。

正确的排名应该是:

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中为不带任何条件的INNER JOIN)来声明和使用变量,而无需使用单独的SET语句。

您需要COALESCE来正确处理NULL。



 类似资料:
  • 我正在尝试在MySQL工作台的结果网格中对检索到的数据进行排序。 例如,使用查询 当我在列和 到SQL查询? 或者,尽管用户界面在列刻度和时间平移上显示了一个箭头,但是MySQL Workbench还是在多个列上进行排序?

  • 问题内容: 我对MYSQL相对较新,遇到了困扰我一段时间的问题。我已经尝试在所有地方使用Google搜索来寻找答案,但到目前为止仍无法找到可接受的解决方案。 这是我当前正在运行的查询,用于查找给定搜索词的最佳匹配项: 它返回的结果是全面的,因为它们包括所有相关的行。但是,它们没有按照任何特定的顺序排序,我希望在用PHP打印结果时首先显示完全匹配的匹配项。像这样: 1 | 字<精确匹配 2 | 填字

  • 我目前有一个查询,它使用MongoTemplate的findAll()方法返回集合中的所有文档。我想对这些结果进行排序,但看不到任何方法。我看到我可以使用find()和一个查询参数并调用。with(Sort Sort),但是在这个场景中,我如何设置查询以返回所有文档?我会同意使用任何一种方法。

  • 我有一个MongoDB集合,它有1000万个数据。我有两个主要字段(字符串类型)和(整数类型)。这两个字段都已编入索引,但是当我在 find 语句之后对结果进行排序时,mongo 需要花费大量时间来返回结果。 如何从find语句中快速排序结果?

  • 问题内容: 正在搜寻 这不起作用....我到处搜索并阅读了文档。但是我只是看不到如何根据他们的“所有者”关系名称对我的(基础)查询进行排序。 它总是导致: 这一定很容易…但是我看不到。还研究了比较器,这似乎合乎逻辑,但是我看不到ORDER BY的查询部分在哪里生成或我应该返回什么,因为所有内容都是动态生成的。为每个“玩家”关系做一个比较器来做一件简单的事情似乎过于复杂。 问题答案: SQLAlch

  • 问题内容: 假设我们有一个这样的数据库: Project_tbl: personel_project_tbl: instrument_project_tbl: 现在,我需要对项目列表进行排序,并根据它们与项目A的相似性对其进行排名。 例如: A和B在3个用户中共有1个用户,在2个工具中有2个用户,因此它们的相似度排名是(1/2 + 2/2)/ 2 = 75% A和C没有共同的用户,但拥有2台以上的