在数据库表中使用排序顺序列

假设我Product在购物网站的数据库中有一个表,用于保存商店产品的描述,价格等。使客户能够重新订购这些产品的最有效方法是什么?


我创建了一个Order用于对记录进行排序的列(整数),但是由于我使用了原始方法来更改每个记录的顺序,因此使我在性能方面有些头疼。一个例子:


Id    Order

5     3

8     1

26    2

32    5

120   4

现在我该怎么做才能将记录的顺序更改ID=26为3?


我所做的是创建一个过程,该过程检查目标顺序(3)中是否有记录,如果没有,则更新行的顺序(ID = 26)。如果有目标顺序的记录,则过程将执行自身发送该行的ID target order + 1作为参数。


这导致在我要更改以腾出空间的每个记录之后更新每个记录:


Id    Order

5     4

8     1

26    3

32    6

120   5

那么一个聪明的人会做什么?


我使用SQL Server 2008 R2。

编辑:


我需要一个项目的order列足以在不涉及辅助键的情况下进行排序。仅订单列必须为其记录指定唯一的位置。


除了所有这些之外,我想知道是否可以实现链接列表之类的功能:使用“下一个”列而不是“订单”列来保留下一个项目ID。但是我不知道如何编写查询以正确的顺序检索记录。如果有人也对这种方法有想法,请分享。


ABOUTYOU
浏览 748回答 3
3回答

手掌心

Update product set order = order+1 where order >= @value changed尽管随着时间的流逝,您会在订单中获得越来越大的“空间”,但仍会“排序”这将在一个语句中为要更改的值及其后的每个值加1,但以上语句仍然为真。您的订单中将形成越来越大的“空格”,甚至可能超过INT值。给定无空格的替代解决方案:想象一下以下过程:具有@ NewOrderVal,@ IDToChange,@ OriginalOrderVal参数的UpdateSortOrder分两步进行,取决于新/旧订单是向上还是向下排序。If @NewOrderVal < @OriginalOrderVal --Moving down chain&nbsp;--Create space for the movement; no point in changing the original&nbsp;&nbsp; &nbsp; Update product set order = order+1&nbsp;&nbsp; &nbsp; where order BETWEEN @NewOrderVal and @OriginalOrderVal-1;end ifIf @NewOrderVal > @OriginalOrderVal --Moving up chain--Create space&nbsp; for the momvement; no point in changing the original&nbsp;&nbsp;&nbsp; Update product set order = order-1&nbsp;&nbsp; where order between @OriginalOrderVal+1 and @NewOrderValend if--Finally update the one we moved to correct value&nbsp; &nbsp; update product set order = @newOrderVal where ID=@IDToChange;关于最佳实践;我去过的大多数环境通常都希望按类别对它们进行分类并按字母顺序或基于“受欢迎程度”进行排序,从而无需提供用户定义的排序。

倚天杖

我过去使用的一种解决方案(取得了一些成功)是使用“重量”而不是“顺序”。重量很明显,较重的物品(即:数字越小)沉入底部,越轻(数字越大)则升至顶部。如果我有多个重量相同的物品,我认为它们具有相同的重要性,并按字母顺序排列。这意味着您的SQL将如下所示:ORDER BY 'weight', 'itemName'希望能有所帮助。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

SQL Server