可能我說的交換排序還有點歧義。看下面的圖片
就是要實現這樣的排序。
首先數據庫結構得具備3個字段
ID , Name , OrderNum
排序的規則為,首先按OrderNum倒序排列,然後如果OrderNum 相同則按ID的倒序排列。
Sql語句為
Select * From Sorts Order By OrderNum Desc, ID Desc
當點向上箭頭的時候,表示要把當前的記錄和上面的記錄交換,實現排序。同樣點向下箭頭的時候也一樣。
假設我們當需要把上圖中ID為1的記錄和ID為3的記錄交換。假設是把1向上和3交換(點1的上箭頭)。
如果,ID3的OrderNum 為2,ID1的OrderNum 為1,那麼直接交換OrderNum 就可以。看來是如此,但是真的可以麼?
假設數據如下:
ID Name OrderNum
4 .... 2
3 .... 2
6 ...... 1
.........
上面的數據是可能的,假如把ID6的OrderNum 換成是2就跑第一個去了!
這裡就不詳細介紹各種可能了,我介紹下我采用的方法。
我使用存儲過程來解決這個問題,需要傳遞的參數為:1、是up(上箭頭)還是down(下箭頭),2、選擇記錄的id,3、選擇記錄的order。
<a href="?order=up&id=<%# Eval("ID") %>&type=<%# Eval("OrderNum ") %>">↑</a>
|
<a href="?order=down&id=<%# Eval("ID") %>&type=<%# Eval("OrderNum ") %>">↓</a>
存儲過程為
CREATE PROCEDURE NewsSortOrder @order char(20),@id int,@type int AS
declare @nowid int --搜索上一條或下一條的ID
if @order = "up" --上升
begin
set @nowid = (select Top 1 ID From Sorts Where OrderNum >= @type And ID<>@id Order By OrderNum ASC )
if isnumeric(@nowid) = 1 --假如為數字的話
begin
if (Select
OrderNum From Sorts Where ID = @nowid) = @type --假如兩記錄type相同的情況
begin
Update Sorts Set OrderNum = OrderNum + 1 Where ID = @id Or OrderNum > @type --該記錄type+1並且他的上面的記錄除了上一條type全部加一
end
else
begin --開始調換
Update Sorts Set OrderNum = (Select OrderNum From Sorts Where ID = @nowid) Where ID = @id
Update Sorts Set OrderNum = @type Where ID = @nowid
end
end
end
if @order = "down" --下降
begin
set @nowid = (select Top 1 ID From Sorts Where OrderNum <= @type And ID <>@id Order By OrderNum Desc)
if isnumeric(@nowid) = 1 --如果為數字
begin
if (Select OrderNum From Sorts Where ID = @nowid) = @type --假設兩記錄type相同
begin
Update Sorts Set OrderNum = OrderNum - 1 Where ID = @id Or OrderNum < @type --該記錄type-1並且他的下面的記錄除了下一條type全部減一
end
else
begin --開始調換
Update Sorts Set OrderNum = (Select OrderNum From Sorts Where ID = @nowid) Where ID = @id
Update Sorts Set OrderNum = @type Where ID = @nowid
end
end
end
GO
以上是.Net2.0 + SqlServer 2000 調試