我想按定义的顺序列出项目。所以我的表有订单栏,它会保留订单号。所以,我可以使用该订单号列出项目。如果项目数量较少则表示没有 问题,但它越来越多了。我遇到了麻烦。
项目表: -
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时出现问题。
所以建议我。还有一个好主意是按照定义的顺序保持秩序吗?
由于
答案 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的记录将是第一个,而另一个记录将是第二个。