通过PHP更新MySQL中“订单”列的最有效方法是什么?

时间:2009-09-06 14:34:34

标签: php mysql list

我目前正在通过Flex和Zend Framework创建Flash CMS。在Flex界面中,我有一个通过Zend Framework从MySQL数据库中提取的可拖动项目列表。用户可以通过拖放来重新排列项目,这将改变它们在映射的Flex阵列中的顺序。

回到服务器上,我的“items”表中有一个名为“order”的列,用于跟踪项目的顺序以便进行演示。 所以我的问题是在数据库的“订单”列中更新我的更改的最有效方法是什么?

我知道我可以遍历整个数组并在每一行上运行更新查询,将订单值更新为计数器/迭代器的值,但这看起来有点难看,我可能不需要更新每一行,我可能会很快向MySQL发出大量查询。

任何想法都会非常感激。

谢谢你的期待。 :)

5 个答案:

答案 0 :(得分:2)

检查以下两个问题;
Fetching linked list in MySQL database
What is the most efficient/elegant way to parse a flat table into a tree?

如果你想要整个列表中的提取,你必须实现一个链表。

答案 1 :(得分:1)

每次用户移动项目时,您是否更新表格?

如果是,那么您可以将数据库中的项目顺序存储为链接列表。每个项目都会知道他的父母 - 他身上的项目。

将一个项目移动到其他地方需要3个数据库更新,这将更改父项。如果你有这个元素的顺序: 一个 乙 C d Ë 并在D和E之间拖动B,这样你就可以了 一个 C d 乙 ë

因此,您将拥有一个“id_parent”列,而不是数据库中的“order”列,而该列将指向一个位置的元素。在这个例子中你会这样做:

UPDATE C set parent ='A' UPDATE B set parent ='D' UPDATE E set parent ='B'

答案 2 :(得分:1)

如果您正在处理单个项目的移动,那么您可以在两个查询中执行此操作,其中一个是:

UPDATE items SET `order` = `order` + 1 
  WHERE `order` >= :index_of_inserted_item 
  ORDER BY `order` DESC

在MySQL中,必须从最高值开始更新,以避免伪造重复键错误。

答案 3 :(得分:0)

我会将原始订单存储在一个数组中 - 例如作为这样的POST变量:$ _POST [order] = array(1,2,3)。当用户提交时,我会将新订单存储在另一个数组中。最后,我会比较之前和之后的值,并只更新它们的不同之处。

代码示例:

$before = array(1,2,3);
$after  = array(2,1,3);

for($i=0; $i<count($before); $i++) {
    if($before[$i] !== $after[$i]) {
        $chg[] = $i;
    }
}

print_r($chg);

结果:数组([0] =&gt; 0 [1] =&gt; 1)

这意味着您只需要更新前两行。

答案 4 :(得分:0)

MySQL中是否有ROWNUM SQL子句。如果有,这样的事情可能有用(或不):

UPDATE table
SET Order = ROWNUM
WHERE GroupId = Id