【问题标题】:Fastest way to update orderning in MySQL在 MySQL 中更新排序的最快方法
【发布时间】:2014-07-19 14:44:42
【问题描述】:

假设我有一个项目列表,所有项目都是从数据库生成的。为了这个例子,我们称它们为:

item1
item2
item3
...
itemN

假设我想允许某人拖动这些项目中的任何一个并按照他们想要的顺序放置它们(即他们可以将 item10 放在 item2 和 item3 之间,以便它现在显示在 item2 之后)。

这意味着我需要更新放置拖动项目之后的所有项目的顺序。这样做最有效的方法是什么?有什么诀窍还是我只是在之后更新所有内容?

编辑:

节点方法会更快吗?\ 节点,我的意思是每个项目都链接到下一个项目。这样,您只需要更新三个节点的子节点,然后其他一切都会正常工作。所以在我上面的例子中,在拖动之前我有:

item2.child = item3itemN-1.child = itemNitemN.child = null

拖动后,我需要更新:

item2.child = itemNitemN.child = item3itemN-1.child = null

这是一个更好的实现吗?这样做,我想不出一种方法来正确显示来自数据库的查询列表......

【问题讨论】:

  • 我只是更新每一行(即使只有两个交换的位置),但我也想知道这一点。似乎为最小化服务器端代码中的更新而付出的额外努力是不值得的,但也许还有另一种方法。您使用什么语言?
  • 我在 Laravel 框架中使用 PHP。但正如你所说,我更感兴趣的是逻辑,而不是实际的代码实现。
  • 有很多关于这些东西的教程,例如webresourcesdepot.com/wp-content/uploads/file/jquerydragdrop
  • 不不,我的意思是数据库更新,而不是 UI 视图
  • 这些“项目”是什么,它们的顺序是什么意思? 需要订购吗?相对容易的约会是否足够?

标签: php html mysql sorting


【解决方案1】:

如果您在这里谈论 UI 方式是:

假设我们有 5 个元素名称,每个元素都有一个名为“order”的属性

<ob1 order="1" name="1">
<ob1 order="2" name="2">
<ob1 order="3" name="3">
<ob1 order="4" name="4">
<ob1 order="5" name="5">

假设我们要将名称为“5”的那个放在第一位。

变成:

<ob1 order="1" name="5">
<ob1 order="2" name="1">
<ob1 order="3" name="2">
<ob1 order="4" name="3">
<ob1 order="5" name="4">

当您将 name="5" 拖到顶部时,订单将设置为 1,然后将其余订单添加到它们中。

或者:

假设我们有 5 个元素名称,每个元素都有一个名为“order”的属性

<ob1 order="1" name="1">
<ob1 order="2" name="2">
<ob1 order="3" name="3">
<ob1 order="4" name="4">
<ob1 order="5" name="5">

当您将 name="5" 移到顶部时,它会获取下一个元素的排序顺序,然后从中减去 1,因此:

变成:

<ob1 order="0" name="5">
<ob1 order="1" name="1">
<ob1 order="2" name="2">
<ob1 order="3" name="3">
<ob1 order="4" name="4">

再次应用相同的类型让 4 移到顶部:

<ob1 order="-1" name="4">
<ob1 order="0" name="5">
<ob1 order="1" name="1">
<ob1 order="2" name="2">
<ob1 order="3" name="3">

对不起,文字墙。

在数据库中移动它们的最快方法:没有一种。处理代码中的排序,然后将排序应用于数据库。

【讨论】:

  • 感谢您的信息,但我更多地谈论的是数据库更新,而不是 UI。
  • 那里也有 :) 最后一部分。
【解决方案2】:

既然你对实际逻辑感兴趣,这里是我几个月前实施的想法:

  • 对于 UI,尽可能延迟任何服务器端请求
  • 发送订购请求时,请将数据格式化为id =&gt; order。最理想的方式。
  • 激活交易
  • 获取所有数据(可能由id 字段索引)
  • 根据POST和fetch数据计算delta,也就是有什么没变。 这可以大大减少要运行的查询数量。
  • 根据需要运行尽可能多的 UPDATE 查询
  • 提交事务。

结论:我想不出最佳的方法,主要是因为SQLUPDATE查询的性质

【讨论】:

    猜你喜欢
    • 2018-01-05
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 2011-04-20
    • 2020-04-08
    相关资源
    最近更新 更多