2015-01-10 104 views
-1

我試圖弄清楚是否有辦法執行查詢來按某一行的數值排序,但是在設置的條件下它會對結果進行「雙重過濾」(可能是不正確的詞)並重新排列它們。可以使用SQL ORDER BY邏輯雙重過濾嗎?

的一個很好的例子如下:

的遊戲有一個記分板/排行榜系統中,它顯示排名靠前的選手,但是當多個玩傢俱有相同的技能水平,它將通過對他們進行排名的贏的數量。

因此,例如我在我的數據庫中的以下信息:

+----+--------+------+--------+ 
| 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數組,然後針對每個評級(Where rating =?)運行查詢,但似乎高度冗餘。

+0

等級DESC,勝DESC?!?!? – Strawberry

+1

你可以有多個由''''分隔的'by by'子句,就像'order by desc desc,wins desc'一樣' – lared

+0

爲什麼你不向我們展示你的查詢?如lared所說,你可以使用多個列進行排序! –

回答

2

在SQL中,您可以有多個ORDER BY子句,由, s分隔。排序是分開執行的,第一個是最左邊的一個,然後第一個排序列中具有相同值的記錄組將被下一個語句排序,依此類推。在您的情況下,查詢將如下所示:

SELECT * FROM players ORDER BY rating DESC, wins DESC; 
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的在線預訂

+0

OP詢問MySQL –