【问题标题】:Best way to list the items by order按顺序列出项目的最佳方式
【发布时间】:2011-07-05 10:06:44
【问题描述】:

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

物品表:-

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

使用 varorder,我可以按定义的顺序列出项目,如下所示

SELECT item FROM tbl_item ORDER BY varorder ASC

查询结果我正确的项目顺序如A1,A2,A4,A5,A2,...,A1K

我的问题

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

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

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

所以建议我。是否有另一个好主意可以按规定的顺序保持秩序?

谢谢

【问题讨论】:

  • 我不确定是否有更好的方法来保持秩序。就向上箭头将元素 1K 移动到位置 1 的点击量而言:您是否考虑过类似下拉菜单,用户可以从中将元素移动到选定索引?会节省很多点击...
  • 嗯!我写了一个网站,产品订单可以通过拖放重新排序!管理员可以通过拖放产品重新排序产品并放入正确的级别!是你的问题吗?如果是,我可以帮助你!我可以把那个代码发给你
  • 拖放也不错,但考虑到列表中超过 1K 的元素,在将元素从几乎末尾拖动到列表开头时,列表的滚动是否正常?跨度>

标签: php mysql performance


【解决方案1】:

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

【讨论】:

  • 对于较大的数据集,计算 min(sortdatechanged) 会不会很慢?
  • OP 提到了 1,000 个项目 - 这不是特别大。
【解决方案2】:

关于 UI:拖放 = 最佳方式。

关于更新: 您可以使用 varcode,例如:256 512 768 1024... 因此,当您想要移动某个元素时,您将其编号更新为 (lefter + righter) / 2。在 lefter = 1; 等情况下。更正确 = 2; (左 + 右) / 2 = 1.5;您必须运行一些程序,根据当前排序将所有元素更新为 (256 512 768 1024...)。

【讨论】:

    【解决方案3】:

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

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

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

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

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2023-03-03
        • 1970-01-01
        • 1970-01-01
        • 2018-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多