按订单列出项目的最佳方式

时间:2011-07-05 10:06:44

标签: php mysql performance

我想按定义的顺序列出项目。所以我的表有订单栏,它会保留订单号。所以,我可以使用该订单号列出项目。如果项目数量较少则表示没有 问题,但它越来越多了。我遇到了麻烦。

项目表: -

id   item varorder
1     A1    1
2     A2    2
3     A3    5
4     A4    3
5     A5    4
......
1000  A1k   1000

使用varorder,我可以按照定义的顺序列出项目,如bellow

SELECT item FROM tbl_item ORDER BY varorder ASC

查询会产生A1,A2,A4,A5,A2,...,A1K

等项目的正确顺序

我的问题

尝试将A1K varorder设为1时出现问题。

  • 使用向上和向下箭头 我可以使用上一个和下一个箭头交换项目或更改项目的顺序。如果我想在第一个位置制作A1K,我应该点击向上箭头1000次。这对管理项目来说真的很糟糕。

enter image description here

  • 使用正常更新 如果我想在第一个位置制作A1K,我应该更新所有行(1000)以保持秩序正确。所以我不认为这是个好主意。

所以建议我。还有一个好主意是按照定义的顺序保持秩序吗?

由于

4 个答案:

答案 0 :(得分:1)

添加一列“sortdatechanged”并在插入时将其设为now()。然后在点击向上箭头时更新它。当您按下向下箭头时,将varorder更新为max(varorder)+1,并将sortdatechanged设置为min(sortdatechanged)。然后按sortdatechanged desc,varorder。

选择

答案 1 :(得分:0)

关于用户界面:拖放=最佳方式。

关于更新: 您可以使用以下代码:256 512 768 1024 ...所以当你想移动一些元素时,你将他的数字更新为(lefter + righter)/ 2.例如lefter = 1; righter = 2; (lefter + righter)/ 2 = 1.5;你必须运行一些程序,根据当前的排序将所有元素更新为(256 512 768 1024 ...)。

答案 2 :(得分:0)

您可能会考虑稀疏排序,例如:

id   item varorder
1     A1    10000
2     A2    20000
3     A3    50000
4     A4    30000
5     A5    40000

然后,您可以在列表中的任何其他元素之前或之间移动元素,而无需更新表中的每一行。我建议使用一个varorder附加到列表末尾的算法,该算法比前一个varorder大至少10,000,并通过分配插入来处理两个现有元素之间的插入元素a varorder位于两个现有元素的varorder之间。

因此,通过上面的示例,将A3移动到列表中的第二个位置将产生:

id   item varorder
1     A1    10000
2     A2    20000
3     A3    15000
4     A4    30000
5     A5    40000

如果非常大重定位次数,这种方法最终会耗尽稀疏索引中的空间,所以你必须问自己的问题是你是否认为会有那么多在实践中重新排序操作。

答案 3 :(得分:0)

行的更新将是问题,因为它们是数百万,而不是1000。 在这种情况下,您可以使用varorder和orderupdated,并按varoder ASC,orderupdated DESC进行排序。这样,当2个记录具有相同的顺序(1)时,之后设置为1的记录将是第一个,而另一个记录将是第二个。

相关问题