为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

ABOUTYOU 2019-11-29 09:53:08
假设我Product在购物网站的数据库中有一个表,用于保存商店产品的描述,价格等。使客户能够重新订购这些产品的最有效方法是什么?我创建了一个Order用于对记录进行排序的列(整数),但是由于我使用了原始方法来更改每个记录的顺序,因此使我在性能方面有些头疼。一个例子:Id    Order5     38     126    232    5120   4现在我该怎么做才能将记录的顺序更改ID=26为3?我所做的是创建一个过程,该过程检查目标顺序(3)中是否有记录,如果没有,则更新行的顺序(ID = 26)。如果有目标顺序的记录,则过程将执行自身发送该行的ID target order + 1作为参数。这导致在我要更改以腾出空间的每个记录之后更新每个记录:Id    Order5     48     126    332    6120   5那么一个聪明的人会做什么?我使用SQL Server 2008 R2。编辑:我需要一个项目的order列足以在不涉及辅助键的情况下进行排序。仅订单列必须为其记录指定唯一的位置。除了所有这些之外,我想知道是否可以实现链接列表之类的功能:使用“下一个”列而不是“订单”列来保留下一个项目ID。但是我不知道如何编写查询以正确的顺序检索记录。如果有人也对这种方法有想法,请分享。
查看完整描述

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;

关于最佳实践;我去过的大多数环境通常都希望按类别对它们进行分类并按字母顺序或基于“受欢迎程度”进行排序,从而无需提供用户定义的排序。


查看完整回答
反对 回复 2019-11-29
?
倚天杖

TA贡献1828条经验 获得超3个赞

我过去使用的一种解决方案(取得了一些成功)是使用“重量”而不是“顺序”。重量很明显,较重的物品(即:数字越小)沉入底部,越轻(数字越大)则升至顶部。


如果我有多个重量相同的物品,我认为它们具有相同的重要性,并按字母顺序排列。


这意味着您的SQL将如下所示:


ORDER BY 'weight', 'itemName'

希望能有所帮助。


查看完整回答
反对 回复 2019-11-29
  • 3 回答
  • 0 关注
  • 745 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信