我目前正在通过Flex和Zend Framework创建Flash CMS。在Flex界面中,我有一个通过Zend Framework从MySQL数据库中提取的可拖动项目列表。用户可以通过拖放来重新排列项目,这将改变它们在映射的Flex阵列中的顺序。
回到服务器上,我的“items”表中有一个名为“order”的列,用于跟踪项目的顺序以便进行演示。 所以我的问题是在数据库的“订单”列中更新我的更改的最有效方法是什么?
我知道我可以遍历整个数组并在每一行上运行更新查询,将订单值更新为计数器/迭代器的值,但这看起来有点难看,我可能不需要更新每一行,我可能会很快向MySQL发出大量查询。
任何想法都会非常感激。
谢谢你的期待。 :)
答案 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