【问题标题】:Mysql rank, asc or descMysql rank, asc or desc
【发布时间】:2013-07-08 16:56:46
【问题描述】:

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

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  

所以我想要的仍然是能够按points 进行排名,但是如果我想按 asc 排序,排名将反向...4、3、2、1。这可能吗?

Edit* 这是我使用上述代码时的样子。

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

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

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

分数是相反的,但排名保持不变。

【问题讨论】:

  • 请提供测试数据和您期望的输出。
  • 你想用mysqlASC做什么应该显示DESC你睡得好吗??
  • 选择查询没有提到'point',它是表格的一部分吗?您可能需要用“as point”命名一些搜索字段
  • 对于它的排名仍然是 0+1, 1+1, 2+1, 3+1 .... 不管你如何订购... 所以也许你想要的是嵌套这个在另一个查询中查询,然后按排名排序
  • 我编辑了原件,让您有更好的想法。

标签: mysql ranking rank


【解决方案1】:
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

【讨论】:

  • 代码错误:“...正确的语法在 '*) 附近使用,来自竞赛条目)n ORDER BY points asc' 在第 11 行”
  • 将 distinct * 替换为不同的用户名。现在就试试吧。
  • 这并没有真正得到我想要的,但我有一种感觉你在正确的轨道上。当我只想选择一个用户名“where username=name2”时,它会为每个人带来“2”的排名。
  • 我尝试的每个用户的排名都为“0”。
  • 这是您发布的第一个代码:sqlfiddle.com/#!2/3363f/1 然后使用条件这是第二个:sqlfiddle.com/#!2/3363f/2 在第二个链接中看到它说“其中 username=name1”它带回了排名“2”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-01
  • 2017-10-27
  • 1970-01-01
  • 2019-06-09
  • 2015-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多