SQL ORDER BY逻辑双重过滤可能吗?

时间:2015-01-10 01:18:13

标签: mysql sql

我试图弄清楚是否有办法执行查询以按某行的数字值排序,但是在设定条件下它会"双重过滤&#34 34;(可能是不正确的术语)结果并重新安排它们。

一个很好的例子如下:

游戏有一个记分牌/排行榜系统,其中显示排名最高的玩家,但是当多个玩家具有相同的技能等级时,它将根据他们的胜利数量对其进行排名。

所以,例如我在我的数据库中有以下信息:

+----+--------+------+--------+
| id | player | wins | rating |
+----+--------+------+--------+
|  1 | Tom    |   12 |   1300 |
|  2 | Bob    |   18 |   1300 |
|  3 | Jim    |    7 |   1284 |
|  4 | Ed     |    2 |   1312 |
+----+--------+------+--------+

标准order by 'rating'查询将按此顺序显示

+----+--------+------+--------+
| id | player | wins | rating |
+----+--------+------+--------+
|  4 | Ed     |    2 |   1312 |
|  1 | Tom    |   12 |   1300 |
|  2 | Bob    |   18 |   1300 |
|  3 | Jim    |    7 |   1284 |
+----+--------+------+--------+

但是,由于TomBob具有相同的评分,我想按胜利排序,因此表格如下:

+----+--------+------+--------+
| id | player | wins | rating |
+----+--------+------+--------+
|  4 | Ed     |    2 |   1312 |
|  2 | Bob    |   18 |   1300 |
|  1 | Tom    |   12 |   1300 |
|  3 | Jim    |    7 |   1284 |
+----+--------+------+--------+

有什么想法吗?我知道我可以通过运行单个查询,然后为具有相同评级的每个人创建2D数组,然后为每个评级运行查询(其中评级=?),但这看起来非常多余。

2 个答案:

答案 0 :(得分:2)

在SQL中,您可以有多个ORDER BY子句,以,分隔。排序是单独执行的,第一个是最左边的排序,然后第一个排序列中具有相同值的记录组然后按下一个语句排序,依此类推。在您的情况下,查询将如下所示:

 SELECT * FROM players ORDER BY rating DESC, wins DESC;

答案 1 :(得分:1)

您需要为ORDER BY指定方向。检查一下:

SELECT id, player, wins, rating
FROM (values   
  (1, 'Tom', 12,  1300), 
  (2, 'Bob', 18,  1300), 
  (3, 'Jim', 7,   1284),
  (4, 'Ed',  2,   1312) 
 ) as T  (id, player, wins, rating)
ORDER BY rating desc, wins desc

阅读SQL Server联机丛书