mysql - 如何使用 WHERE 子句和 UNION ALL 在 MySQL 中排名

标签 mysql select ranking

我需要一些关于 MySQL 查询的帮助。我正在尝试使用 WHERE 子句对参与者进行排名。所以,我想分别对新手、中级和有经验的人进行排名。例如:

Rank Name    Grade  Type
----------------------------------
1    Bob     98     Novice 
2    Jill    88     Novice 
3    Jimmy   42     Novice 
1    Mark    87     Intermediate 
2    Scott   85     Intermediate
3    Jim     77     Intermediate 
1    Jane    90     Advanced 
2    John    89     Advanced 
3    Josh    87     Advanced

我试过:

SET @rank=0;

(SELECT @rank:=@rank+1 AS rank, name, grade, type FROM myTable WHERE type='novice' ORDER BY grade DESC)
UNION ALL
(SELECT @rank:=@rank+1 AS rank, name, grade, type FROM myTable WHERE type='intermediate' ORDER BY grade DESC)
UNION ALL
(SELECT @rank:=@rank+1 AS rank, name, grade, type FROM myTable WHERE type='experienced' ORDER BY grade DESC)

我想我需要以某种方式重新设置排名。也许我还有其他问题?

最佳答案

使用:

SELECT t.name,
       t.grade,
       t.type,
       (SELECT COUNT(*)
          FROM YOUR_TABLE x
         WHERE x.type = t.type
           AND x.grade >= t.grade) AS rank
 FROM YOUR_TABLE t

要处理两个成绩列,请使用:

SELECT t.name,
       t.grade1,
       t.grade2,
       t.type,
       (SELECT COUNT(*)
          FROM YOUR_TABLE x
         WHERE x.type = t.type
           AND (x.grade1 + x.grade2) >= (t.grade1 + t.grade2)) AS rank
 FROM YOUR_TABLE t

我如何将新手和中级放在一起,将高级分别排列?

使用:

SELECT y.*,
       (SELECT COUNT(*)
          FROM (SELECT *, 
                       CASE t.type
                         WHEN 'Advanced' THEN t.type
                         ELSE 'Non-Advanced'
                       END AS group_type
                  FROM YOUR_TABLE) x
         WHERE x.group_type = y.group_type
           AND (x.grade1 + x.grade2) >= (y.grade1 + y.grade2)) AS rank
  FROM (SELECT t.name,
               t.grade1,
               t.grade2,
               t.type,
               CASE t.type
                 WHEN 'Advanced' THEN t.type
                 ELSE 'Non-Advanced'
               END AS group_type
          FROM YOUR_TABLE t) y

关于mysql - 如何使用 WHERE 子句和 UNION ALL 在 MySQL 中排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3398386/

相关文章:

PHP 递增数,每次创建一个新的div

python - 排名聚合: Merge local subrankings into global ranking

algorithm - 根据#followers #following 推特用户的 "importance"值的等式

php - 如何限制 PHP 搜索表单中的查询至少需要五个正确字符

mysql - 为每个用户在两个表中选择 SUM

mysql - 如何创建触发器以在更新该行时增加该列?

mysql没有问题

java - 如何在JAVA jdbc中运行SQL(MYSQL)存储过程?

c# - 扩展 IEnumerable 的选择以在选择器中包含源

MySQL - 我怎样才能使我的查询条件基于它会返回的行数?