Mysql 排名,asc 或 desc

标签 mysql ranking rank

我下面有一个查询,它使用基于的排名方法。问题是,如果我按 asc 排序,排名仍然显示 1、2、3、4 等,而不是 4、3、2、1。(或者如果只想获得一个人的排名(其中 username=name1),结果会出现返回 1,而不是基于积分的实际排名)。我的代码如下:

SELECT username, @n := @n + 1 ranking, `1st places`, `2nd places`, `3rd places`, `avg`, `1st places` + `2nd places` + `3rd places` AS `points`
FROM (SELECT username,  
SUM(CASE WHEN rating = 1 THEN 10 ELSE 0 END) `1st places`,
SUM(CASE WHEN rating = 2 THEN 5 ELSE 0 END) `2nd places`,
SUM(CASE WHEN rating = 3 THEN 3 ELSE 0 END) `3rd places`,
format(avg(rating),0) `avg`

FROM contest_entries 
GROUP BY username 

) q, (SELECT @n := 0) n 
ORDER BY `points` desc  

所以我想要的是仍然能够按排名,但如果我想按升序排序,排名将相反......4,3,2,1。这可能吗?

编辑* 这就是我使用上面的代码时的样子。

username    ranking   1st places    2nd places  3rd places  avg points
name3          1       10               5            0       1    15
name1          2       10               0            0       1    10
name2          3       0                0            0       6     0

但是,当按点 asc 排序时,结果如下:

username    ranking   1st places    2nd places  3rd places  avg points
name2          1       0                0            0       6    0
name1          2       10               0            0       1    10
name3          3       10               5            0       1    15

积分相反,但排名保持不变。

最佳答案

select * from
(SELECT username, @n := @n - 1 ranking, `1st places`, `2nd places`, `3rd places`, `avg`, `1st places` + `2nd places` + `3rd places` AS `points`
FROM (SELECT username,  
SUM(CASE WHEN rating = 1 THEN 10 ELSE 0 END) `1st places`,
SUM(CASE WHEN rating = 2 THEN 5 ELSE 0 END) `2nd places`,
SUM(CASE WHEN rating = 3 THEN 3 ELSE 0 END) `3rd places`,
format(avg(rating),0) `avg`

FROM contest_entries 
GROUP BY username 

) q, (SELECT @n := count(distinct username)+1 from contest_entries) n 
ORDER BY `points` asc) resultset
order by ranking asc;

fiddle

如果需要添加条件:

 select * from
(SELECT username, @n := @n - 1 ranking, `1st places`, `2nd places`, `3rd places`, `avg`, `1st places` + `2nd places` + `3rd places` AS `points`
FROM (SELECT username,  
SUM(CASE WHEN rating = 1 THEN 10 ELSE 0 END) `1st places`,
SUM(CASE WHEN rating = 2 THEN 5 ELSE 0 END) `2nd places`,
SUM(CASE WHEN rating = 3 THEN 3 ELSE 0 END) `3rd places`,
format(avg(rating),0) `avg`

FROM contest_entries 
GROUP BY username 

) q, (SELECT @n := count(distinct username)+1 from contest_entries)
 n 
ORDER BY `points` asc) resultset where username = 'name1'
order by ranking asc;

fiddle

关于Mysql 排名,asc 或 desc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17532090/

相关文章:

php - 为什么 Laravel 5.6 中没有删除数据表记录

php - 使用 MySQL 和 session 登录

Python——按第一项排列元组,按第二项解析关系

algorithm - 这种比较/排名算法是如何命名的?

sql - 如何对数据集进行密集排名

mysql - 是否需要为所有重复的数据创建一个表?

php - 新用户无法使用面向对象的php在db中注册

sql - Oracle 在多个字段上对列进行排名

mysql - 更新 MySQL 表中的排名

python - 稀疏矩阵Python的秩