我使用表格中的“排序”列在相册上排列照片。 这意味着相册将以“ORDER BY sort”显示。
我有一项功能,允许用户在相册中排列照片,通过拖放照片,在javascript中,然后按“保存”按钮。
将数组(带有已排序的照片ID)发送到进程(在PHP中),然后我想对表上的行重新排序。
我认为最简单的方法是:
for ($c=0; $c<$length; $c++) {
mysql_query('UPDATE photos SET sort="'.$c.'" WHERE id="'.$array[$c].'"');
}
(请忽略此处的清理,重复和其他验证)
但是我担心在这样的循环中进行的查询量很多。
你会如何改进这种方法?
谢谢。
答案 0 :(得分: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)
答案 1 :(得分:1)
我的评论中的blog将此作为解决方案
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
答案 2 :(得分:1)
如果您使用预准备语句,则可以准备一次语句,然后多次运行一次,每张照片一次。这比执行那么多mysql_query
更有效,因为解析和查询计划只进行一次。