在MySQL中更新排序的最快方法

时间:2014-05-29 23:05:17

标签: php html mysql sorting

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

item1
item2
item3
...
itemN

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

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

编辑:

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

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

拖动后,我需要更新:

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

这是一个更好的实施吗?这样做,我无法找到一种方法,然后正确显示数据库中的查询列表...

2 个答案:

答案 0 :(得分:0)

如果您在这里谈论UI方式,那么:

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

<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,然后将其余的1添加到它们。

可替换地:

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

<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">

抱歉有一面文字。

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

答案 1 :(得分:0)

因为,您对实际逻辑感兴趣,这是我几个月前实施的想法:

  • 对于UI,尽可能延迟任何服务器端请求
  • 发送订购请求时,请将数据格式化为id => order。最佳方式。
  • 激活交易
  • 获取所有数据(可能由id字段索引)
  • 根据POST和获取数据计算delta,即具有哪些内容和未发生变化的内容。 这可以大大减少要运行的查询数量。
  • 根据需要运行尽可能多的UPDATE次查询
  • 提交交易。

结论:我无法想到最佳方式,主要是因为SQL UPDATE查询的性质