1

表の「並べ替え」欄を使ってアルバムに写真を並べます。これはアルバムが「ORDER BYソート」で表示されることを意味します。

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は、REPLACEVALUES句と組み合わせて使用​​することです。ただし、その場合、テーブルのすべての列のデータを明示的に指定する必要があります。そうしないと、それらの列のデータが消去されます (デフォルト値に設定されます)。

解決策 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

準備済みステートメントを使用した場合は、ステートメントを 1 回準備してから、写真ごとに 1 回、複数回実行できます。mysql_queryこれは、解析とクエリの計画が 1 回だけ実行されるため、多くの を実行するよりも効率的です。

于 2012-04-28T23:54:38.683 に答える