【问题标题】:What is the most efficent way of updating an "order" column in MySQL via PHP通过 PHP 更新 MySQL 中“订单”列的最有效方法是什么
【发布时间】:2009-09-06 14:34:34
【问题描述】:

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

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

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

任何想法将不胜感激。

感谢收看。 :)

【问题讨论】:

    标签: php mysql list


    【解决方案1】:

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

    如果你想获取整个列表,你必须实现一个链表。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

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

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

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

        更新 C 设置父级 = 'A' 更新 B 设置父级 = 'D' UPDATE E set parent = 'B'

        【讨论】:

        • 在应用程序中将执行排序。它需要遍历数组两次。
        • 您能否提供一个示例,如何通过遍历数组来重新排序信息?
        【解决方案4】:

        我会将原始订单存储在一个数组中 - 例如作为一个 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] => 0 [1] => 1)

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

        【讨论】:

          【解决方案5】:

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

          UPDATE table
          SET Order = ROWNUM
          WHERE GroupId = Id
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-10-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-07-27
            • 2015-04-04
            相关资源
            最近更新 更多