1

我使用表格中的“排序”列将照片排列在相册中。这意味着相册将显示为“ORDER BY sort”。

我有一个功能,允许用户通过在 javascript 中拖放照片,然后按“保存”按钮来排列相册中的照片。

一个数组(带有排序的照片 ID)被发送到进程(在 PHP 中),然后我想重新排序表上的行。

我认为最简单的方法是:

for ($c=0; $c<$length; $c++) {
    mysql_query('UPDATE photos SET sort="'.$c.'" WHERE id="'.$array[$c].'"');
}

(请忽略此处的消毒、重复和其他验证)

但我担心在这样的循环中进行的查询量。

您将如何改进这种方法?

谢谢你。

4

3 回答 3

2

首先,我认为发出多个查询没有任何问题。你测试了吗?你确定这会是性能瓶颈吗?我不这么认为。

但无论如何,解决方案#1是结合子句使用REPLACE 。VALUES但是,在这种情况下,您需要为表的所有列显式指定数据,否则这些列中的数据将被删除(设置为默认值)。

解决方案#2只是为了好玩。我认为没有人会使用它,但仍然:

UPDATE photos
SET sort = (
  SELECT sort FROM (
    SELECT 1 id, 1 sort UNION
    SELECT 2 id, 2 sort UNION
    SELECT 123 id, 3 sort) t
  WHERE t.id = photos.id)
WHERE id IN (1, 2, 123)

解决方案#3与 Zombaya 的几乎相同:

UPDATE photos
SET sort =
  IF(id = 1, 1,
  IF(id = 2, 2,
  IF(id = 123, 3,
    0)))
WHERE id IN (1, 2, 123)
于 2012-04-28T23:15:36.573 回答
1

我评论中的博客将此作为解决方案

UPDATE `table_name` SET `field_name` = CASE `id`
     WHEN '1' THEN 'value_1'
     WHEN '2' THEN 'value_2'
     WHEN '3' THEN 'value_3'
     ELSE `field_name`
END
于 2012-04-28T23:06:29.213 回答
1

如果您使用准备好的语句,您可以准备语句一次,然后运行几次,每张照片一次。这比做那么多mysql_querys效率更高,因为解析和查询计划只进行一次。

于 2012-04-28T23:54:38.683 回答