【发布时间】:2010-10-08 03:22:27
【问题描述】:
我正在创建一个充当优先级列表的 Web 应用程序,允许用户重新排列列表中的一组项目,并通过 PHP 后端将该排列存储在 MySQL 数据库中。
目前,当用户完成他们的项目并保存配置时,我正在为每一行调用一个单独的 UPDATE 语句,为每一行插入 priorityLevel(列表中的位置)。
例如:(不是我的生产代码,但这说明了这一点)
<?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 查询似乎效率低下,尤其是当列表变长并且我们要重新排序许多项目时。我希望有某种方法可以在 UPDATE 命令中动态创建订单,如下所示:
<?php
$database->query("UPDATE `table` SET `priorityLevel` = ORDER_NUMBER " .
"WHERE `ID` IN (12, 17, 27, 26, 5)");
?>
... 其中 ORDER_NUMBER 是一个动态数字,可能由 ID 值在 WHERE 子句中的位置决定。它还需要尊重 WHERE 子句中项目的顺序,以确保根据用户的意愿设置 priorityLevel。
有谁知道这在 MySQL 5 / PHP 5 环境中是否可行?该表使用 MyISAM 引擎,因此不支持事务。
(PS - 我对 MySQL 的一些基础知识已经足够了解,但我远非专家,所以如果这里涉及到除了简单的 CREATE、INSERT、UPDATE、DELETE 命令之外的任何内容,请描述性)
(PPS - 这个主题对谷歌来说很难,因为这些术语太笼统了。如果我搜索“mysql order”,我会得到一堆关于为 MySQL 创建购物车应用程序的教程!)
【问题讨论】:
-
这个问题几乎和这个一模一样:stackoverflow.com/questions/547534/…
-
啊,很相似,谢谢指出。当我自己搜索时,我找不到任何类似的问题。但是,这个问题似乎更关心何时执行订单,我想知道是否有不同的如何保存订单。