Order-By
SQL 中使用者定義的排序
我剛剛閱讀了一篇關於使用者定義結果集排序的有趣部落格文章。
一些應用程序,例如待辦事項列表,需要維護使用者定義的項目順序。挑戰在於順序是任意的,並且可以在使用者重新排列項目時更改
一個範例表可能是這樣的:
create table items ( itemid int primary key, itemdata varchar(200), ... ... userorder ??? );
使用可能的檢索查詢:
select * from items order by userorder asc;
鑑於我想將更新保持在最低限度,更新原子和檢索查詢盡可能簡單和“高性能”,是否有任何方法可以考慮?
我最初的想法是使用一個額外的
TIMESTAMP
列,並且只更新單行userorder
的值(檢索查詢使用ing by ),但是當您需要在具有相同值的其他兩行之間移動一行時,這會失敗.timestamp``ORDER``userorder asc, usertimestamp desc
沒有考慮特定的數據庫,因為我自己使用的範圍很廣。
介紹
一些非常古老的 BASIC 語言要求每一行程式碼都有一個行號。
程式時,行號通常以 10 的倍數間隔。這使您可以在以後的行之間添加更多程式碼。
您的
items
表應遵循相同的概念。基本算法
- 以 10 的倍數開始的值以
userorder
10 開始userid
userorder
根據需要更新應用程序- 您重新編號該使用者
userorder
使用 Analytics- ‘userorder’ 的值保持為 10 的倍數。
commit
數據變化。重列舉程式碼
這基本上是我用過的:
merge into items a using ( select i.itemid ,10 * row_number() over (partition by i.userid order by i.userorder) as new_userorder from items i where i.userid=? ) b on (a.itemid = b.itemid) when matched then update set a.userorder=b.new_userorder ;
我假設此表包含每個人的 TODO 列表,並且每個使用者都由
userid
.此範例使用
ROW_NUMBER()
來自 Oracle。您必須將它替換為您正在使用的任何 RDBMS。