我以前的搜索結果(包含MySQL - row number in recordset?真的幫了我很大忙)並不令人滿意,因爲按其他列排序會覆蓋本機排序@RowNumber
。總是遞增的mysql行號實現(從1到n排序)
考慮我的簡化member
見下表:
row_number | id | firstname | lastname
--------------------------------------
1 | 1 | Steve | Jobs
2 | 2 | Bill | Gates
3 | 3 | Rasmus | Lerdorf
4 | 4 | Linus | Torvalds
導致由以下查詢:
SELECT id, firstname, lastname, @RowNumber = @RowNumber + 1 AS row_number
FROM member, (SELECT @RowNumber := 0) AS counter_table
但是,當我要去基於比ROW_NUMBER或ID,其他的一些列排序row_number
的排序會損壞:
SELECT id, firstname, lastname, @RowNumber = @RowNumber + 1 AS row_number
FROM member, (SELECT @RowNumber := 0) AS counter_table
ORDER BY firstname DESC
結果:
row_number | id | firstname | lastname
--------------------------------------
2 | 2 | Bill | Gates
4 | 4 | Linus | Torvalds
3 | 3 | Rasmus | Lerdorf
1 | 1 | Steve | Jobs
注意:表,查詢和其他任何東西都不是測試示例。只有問題本身在現實世界中!
我認爲這些簡單的情況很容易理解和解決。 (如果他們有任何問題,請忘記這些小錯誤,並考慮自己的重要問題)
當然它會「腐敗」。沒有規則說明記錄集中行號是什麼,因爲結果是動態創建的,但是您有一列表示行的編號。這就是人們通常在應用程序而不是數據庫中執行此功能的原因。 – 2012-02-27 14:22:35
rownumber不是表中的靜態列,因此列上的任何排序都將優先。您可以嘗試創建一個將rownumber作爲其中一列的視圖,然後針對該視圖運行查詢。 – Brian 2012-02-27 14:22:54
這是因爲'ORDER'在SELECT後出現。如果您在名字上添加索引,結果將按順序返回,而不是稍後排序,因此它可以工作。它仍然聞起來。 – 2012-02-27 14:27:12