次の形式の SQL クエリがあります。
UPDATE foo
SET flag=true
WHERE id=?
IDのリストを持つPHP配列もあります。次のように、解析以外でこれを達成するための最良の方法は何ですか...
foreach($list as $item){
$querycondition = $querycondition . " OR " . $item;
}
...そしてWHERE
句で出力を使用しますか?
これは同じことを達成しますが、おそらく速度はあまり向上しませんが、見栄えは良くなります。
mysql_query("UPDATE foo SET flag=true WHERE id IN (".implode(', ',$list).")");
IN ステートメントを使用します。キー値のコンマ区切りリストを提供します。関数を使えば簡単にできimplode
ます。
UPDATE foo SET flag = true WHERE id IN (1, 2, 3, 4, 5, ...)
または、条件を使用できます。
UPDATE foo SET flag = true WHERE flag = false
またはサブクエリ:
UPDATE foo SET flag = true WHERE id IN (SELECT id FROM foo WHERE .....)
IN 句を使用できるはずです (データベースがサポートしていると仮定します)。
UPDATE foo
SET flag=true
WHERE id in (1, 2, 3, 5, 6)
join/implode を使用して、カンマ区切りのリストを作成し、次のようにします。
UPDATE foo SET flag=true WHERE id IN (1,2,3,4)
ケースステートメントで更新を妨害することはできますが、独自にクエリを作成する必要があります。
UPDATE foo
SET flag=CASE ID WHEN 5 THEN true ELSE flag END
,flag=CASE ID WHEN 6 THEN false ELSE flag END
WHERE id in (5,6)
where は省略できますが、テーブル全体を更新する必要がありません。
VB.NET コード: delimitedIdList を文字列として薄暗い = arrayToString(listOfIds)
薄暗い SQL as string = " UPDATE foo SET flag=true WHERE id in (" + delimitedIdList + ")"
runSQL(SQL)
アイテム数の制限がわかっている場合は、他の人が示唆しているように、「IN」句を使用してください。
UPDATE foo SET flag=true WHERE id in (1, 2, 3, 5, 6)
ただし、データベースによっては、句の要素数に制限がある場合があるという警告があります。たとえば、Oracle 7 または 8 (?) では 256 アイテムの制限がありました (これは後のバージョンで大幅に増加しまし
た) リストを反復処理する場合はトランザクションを使用して、更新の 1 つが失敗した場合にロールバックできるようにします
foreach ループ以外にそれを行う方法を見たことがありません。
しかし、何らかの方法で $list がユーザーから取得された場合は、準備済みステートメントを使用して、一度に 1 行ずつ更新することに固執する必要があります (誰かが準備済みステートメントで複数の行を更新する方法を持っていないと仮定します)。それ以外の場合は、SQL インジェクションに対して広くオープンです。