2012-04-28 20 views
1

テーブルの列 "sort"を使用してアルバムに写真を配置します。 これはアルバムが "ORDER BY sort"で表示されることを意味します。"sort"列を使用してMySQLテーブルの行を整列する

私は、アルバムに写真をドラッグ&ドロップしたり、JavaScriptで保存してから「保存」ボタンを押すことで、写真を並べ替えることができます。

(ソートされた写真IDを持つ)配列が(PHPの)プロセスに送信され、テーブルの行を再ソートするとします。

行うには、私の心の中で最も簡単な方法は次のとおりです。

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

(ここでは消毒、重複およびその他の検証を無視してください)

しかし、私は中に作られたクエリの量が心配ですこのようなサイクル。

このアプローチをどのように改善しますか?

ありがとうございます。私のコメントに

+0

私にはうまく見えます。 1つの大きなアップデートでそれをマージし、あなたの入力をサニタイズして、SQLインジェクションに脆弱ではないようにすることができます。 @ Zombayaおかげさまで – Zombaya

+0

私が質問したように、衛生措置やその他の検証は無視してください。しかし、私は1つの大きなアップデートでどのようにマージしますか?それが私が望んだことです、btw。問題は "WHERE"節にあります。 – Nuno

+0

私は間違っている、あなたはそれを行うことはできません。あなたは挿入文でそれを行うことができます、私はそれらを切り替えました。私はおそらくあなたを助けることができる[ブログ](http://www.kavoir.com/2009/05/mysql-update-multiple-rows-with-one-single-query.html)を見つけました。 – Zombaya

答えて

2

まず、私は複数のクエリを発行することに何か問題がないと思うソリューションとしてこれを持っていました。あなたはそれを試しましたか?パフォーマンスのボトルネックになるのではないでしょうか?私はそうは思わない。

しかし、とにかくソリューション#1は、VALUES節と組み合わせてREPLACEを使用します。ただし、その場合は、表のすべての列のデータを明示的に指定する必要があります。そうしないと、その列のデータは消去されます(デフォルト値に設定されます)。

ソリューション#2は楽しいです。溶液#3がZombayaのとほぼ同じである

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) 

を::

UPDATE photos 
SET sort = 
    IF(id = 1, 1, 
    IF(id = 2, 2, 
    IF(id = 123, 3, 
    0))) 
WHERE id IN (1, 2, 123) 
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

'id'にWHEREを追加することを忘れないでください。それ以外の場合は、テーブルのすべての行を調べて更新しようとします。 –

1

あなたはプリペアドステートメントを使用した場合、あなたが文を準備できた私は、誰もがそれを使用すると思いますが、それでもません一度一回、各写真ごとに1回、何回か実行します。これは、解析とクエリの計画が1回だけ行われるため、多くのクエリを実行するよりも効率的です。mysql_query

関連する問題