3 回答
TA贡献1942条经验 获得超3个赞
Update product set order = order+1 where order >= @value changed
尽管随着时间的流逝,您会在订单中获得越来越大的“空间”,但仍会“排序”
这将在一个语句中为要更改的值及其后的每个值加1,但以上语句仍然为真。您的订单中将形成越来越大的“空格”,甚至可能超过INT值。
给定无空格的替代解决方案:
想象一下以下过程:具有@ NewOrderVal,@ IDToChange,@ OriginalOrderVal参数的UpdateSortOrder
分两步进行,取决于新/旧订单是向上还是向下排序。
If @NewOrderVal < @OriginalOrderVal --Moving down chain
--Create space for the movement; no point in changing the original
Update product set order = order+1
where order BETWEEN @NewOrderVal and @OriginalOrderVal-1;
end if
If @NewOrderVal > @OriginalOrderVal --Moving up chain
--Create space for the momvement; no point in changing the original
Update product set order = order-1
where order between @OriginalOrderVal+1 and @NewOrderVal
end if
--Finally update the one we moved to correct value
update product set order = @newOrderVal where ID=@IDToChange;
关于最佳实践;我去过的大多数环境通常都希望按类别对它们进行分类并按字母顺序或基于“受欢迎程度”进行排序,从而无需提供用户定义的排序。
TA贡献1828条经验 获得超3个赞
我过去使用的一种解决方案(取得了一些成功)是使用“重量”而不是“顺序”。重量很明显,较重的物品(即:数字越小)沉入底部,越轻(数字越大)则升至顶部。
如果我有多个重量相同的物品,我认为它们具有相同的重要性,并按字母顺序排列。
这意味着您的SQL将如下所示:
ORDER BY 'weight', 'itemName'
希望能有所帮助。
- 3 回答
- 0 关注
- 784 浏览
添加回答
举报