代码之家  ›  专栏  ›  技术社区  ›  Adam Raney

如何在MySQL中动态设置每行递增值

  •  0
  • Adam Raney  · 技术社区  · 16 年前

    我正在创建一个充当优先级列表的Web应用程序,允许用户重新排列列表中的一组项目,并通过PHP后端将该排列存储在MySQL数据库中。

    现在,当用户完成项目的排列并保存配置后,我会为每一行调用一个单独的更新语句,为每一行插入优先级(列表中的位置)。

    例如:(不是我的生产代码,但这说明了这一点)

    <?php
      $items = array(12, 17, 27, 26, 5); // an array of IDs, in proper order
      // due to nature of foreach loop in PHP, this makes $order be the key value,
      // in this case, 0, 1, 2, 3, 4 respectively
      foreach ($items as $order => $item)
      {
        $database->query("UPDATE `table` SET `priorityLevel` = {$order} " .
                         "WHERE `ID` = {$item}");
      }
    ?>
    

    这已经足够好用了,但运行这么多更新查询似乎效率低下,尤其是当列表变长并且我们要订购许多项目时。我希望有某种方法可以在update命令中动态创建订单,如下所示:

    <?php
      $database->query("UPDATE `table` SET `priorityLevel` = ORDER_NUMBER " .
                       "WHERE `ID` IN (12, 17, 27, 26, 5)");
    ?>
    

    …where order_number是一个动态数字,可能由where子句中id值的位置决定。它需要尊重WHERE子句中项目的顺序,并确保优先级是根据用户的意愿设置的。

    有人知道在mysql 5/php 5环境中是否可以这样做吗?该表正在使用myisam引擎,因此它不支持事务。

    (ps-我对MySQL的一些基本知识已经很了解了,但是我还不是一个专家,所以如果除了简单的创建、插入、更新、删除命令之外,这里还涉及到什么,请描述一下)

    (PPS-这个主题对谷歌来说很难,因为这些术语太笼统了。如果我搜索“mysql订单”,我会得到一系列关于为mysql创建购物车应用程序的教程!)

    2 回复  |  直到 16 年前
        1
  •  0
  •   Carsten    16 年前

    您必须用这样的PHP构建一个查询,并将该查询发送到mysql:

    UPDATE `table`
    SET priorityLevel = 
    CASE 
    WHEN `ID` = 12 THEN 1
    WHEN `ID` = 17 THEN 2 
    WHEN `ID` = 27 THEN 3
    WHEN `ID` = 26 THEN 4
    WHEN `ID` = 5 THEN 5
    END 
    WHERE `ID` IN (12, 17, 27, 26, 5);

    (使用MySQL5.0测试)

        2
  •  0
  •   James Socol    16 年前

    如果您使用一个准备好的语句,也可以使循环更快,这样可以在mysql服务器将查询保存在内存中的同时更改特定的值。这需要使用mysqli扩展,而不是常规的mysql扩展。

    沿着这些线的东西:

    $mysql = new mysqli(HOST, USER, PASS, DB);
    
    $stmt = $mysql->prepare("UPDATE items SET sortorder = ? WHERE id = ?");
    
    $stmt->bind_params('ii', $sort, $id);
    
    foreach ( $items as $sort => $id ) {
        $stmt->execute();
    }