有這樣一個需求,有一個列表,有一個操作順序的選項,這個順序操作是利用箭頭排序的。
點擊向上的箭頭,順序就升一個,點擊向下的箭頭,順序就降一個。
具體的功能如下所示:
我本來想用時間和order兩個欄位來控制,點擊向上,order+1,同時更新下排序時間。
在sql裡就先按order,再按時間排序。
但我發現如果建立一個項目,初始的排序都是0的話,點擊第一個條目向下時,就會使order變成-1,排到最後一位。
請教各位高手有沒有什麼更好的實現方法。
PS:有朋友說,點擊一次箭頭要重新更新一次所有的條目順序,但這樣效率太低了,我放棄這種方法。
補充:非常感謝各位的熱情,各位說的基本上都是同一種可行的方法,(可惜只能採納一個答案,不然我就都採納了。)
總結下我的方法,我在插入資料的時候,使用id作為order,這樣就確保order是唯一的欄位。接下來就是和最接近的一行資料的order進行值的交換。
回複內容:
有這樣一個需求,有一個列表,有一個操作順序的選項,這個順序操作是利用箭頭排序的。
點擊向上的箭頭,順序就升一個,點擊向下的箭頭,順序就降一個。
具體的功能如下所示:
我本來想用時間和order兩個欄位來控制,點擊向上,order+1,同時更新下排序時間。
在sql裡就先按order,再按時間排序。
但我發現如果建立一個項目,初始的排序都是0的話,點擊第一個條目向下時,就會使order變成-1,排到最後一位。
請教各位高手有沒有什麼更好的實現方法。
PS:有朋友說,點擊一次箭頭要重新更新一次所有的條目順序,但這樣效率太低了,我放棄這種方法。
補充:非常感謝各位的熱情,各位說的基本上都是同一種可行的方法,(可惜只能採納一個答案,不然我就都採納了。)
總結下我的方法,我在插入資料的時候,使用id作為order,這樣就確保order是唯一的欄位。接下來就是和最接近的一行資料的order進行值的交換。
order欄位插入資料時設定為目前時間,然後某條記錄點上(下)的時候找order小於(大於)本條記錄的第一條(差最小)的記錄,交換他們的order值
這樣無論列表多長,每次交換的成本都是 一句select where order < xx limit 1(索引)和兩次update
既然有了 order 欄位並且按這個排序,更新時間就沒有必要了。
點擊 order = n 這一行後面的向上的剪頭:
將 order = n 的 同 order = n - 1 的 order 值互換
點擊 order = n 這一行後面的向下的剪頭:
將 order = n 的 同 order = n + 1 的 order 值互換
方法一:排序欄位unique,升降時採用“就近替換”。這個的缺點是,插入記錄若要指定跟隨某行,會產生重排,最壞情況是全表,理想的只是插空。建議採用RAND擷取unique值,這樣可以產生空。此外重排的時候最好加上事物,防止多人操作產生奇怪的事情。
方法二:兩個欄位進行排序,允許排序欄位重複,用額外欄位來確定等值“排序欄位”的排序。
方法三:排序欄位是字串XXXBBB,XXX是主序欄位,BBB是輔助排序欄位
PHP配合JQUERY來做吧,互動方面會最佳化很多,比如使用JQUERY排序後,AJAX 傳回給PHP,PHP計算排序或交換排序
吐槽個:什麼年代了,還用上下箭頭排序,果斷應該用js來搞拖動排序