8

次の形式の SQL クエリがあります。

UPDATE foo
SET flag=true
WHERE id=?

IDのリストを持つPHP配列もあります。次のように、解析以外でこれを達成するための最良の方法は何ですか...

foreach($list as $item){  
    $querycondition = $querycondition . " OR " . $item;  
}

...そしてWHERE句で出力を使用しますか?

4

8 に答える 8

9

これは同じことを達成しますが、おそらく速度はあまり向上しませんが、見栄えは良くなります。

mysql_query("UPDATE foo SET flag=true WHERE id IN (".implode(', ',$list).")");
于 2008-09-02T15:29:18.770 に答える
5

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 .....)
于 2008-09-02T15:30:53.413 に答える
5

IN 句を使用できるはずです (データベースがサポートしていると仮定します)。

UPDATE foo SET flag=true WHERE id in (1, 2, 3, 5, 6)

于 2008-09-02T15:27:12.457 に答える
1

join/implode を使用して、カンマ区切りのリストを作成し、次のようにします。

UPDATE foo SET flag=true WHERE id IN (1,2,3,4)
于 2008-09-02T15:29:02.887 に答える
0

ケースステートメントで更新を妨害することはできますが、独自にクエリを作成する必要があります。

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 は省略できますが、テーブル全体を更新する必要がありません。

于 2008-09-02T15:29:18.893 に答える
0

VB.NET コード: delimitedIdList を文字列として薄暗い = arrayToString(listOfIds)

薄暗い SQL as string = " UPDATE foo SET flag=true WHERE id in (" + delimitedIdList + ")"

runSQL(SQL)

于 2008-09-02T15:29:25.477 に答える
0

アイテム数の制限がわかっている場合は、他の人が示唆しているように、「IN」句を使用してください。

UPDATE foo SET flag=true WHERE id in (1, 2, 3, 5, 6)

ただし、データベースによっては、句の要素数に制限がある場合があるという警告があります。たとえば、Oracle 7 または 8 (?) では 256 アイテムの制限がありました (これは後のバージョンで大幅に増加しまし
た) リストを反復処理する場合はトランザクションを使用して、更新の 1 つが失敗した場合にロールバックできるようにします

于 2008-09-02T15:39:06.840 に答える
0

foreach ループ以外にそれを行う方法を見たことがありません。

しかし、何らかの方法で $list がユーザーから取得された場合は、準備済みステートメントを使用して、一度に 1 行ずつ更新することに固執する必要があります (誰かが準備済みステートメントで複数の行を更新する方法を持っていないと仮定します)。それ以外の場合は、SQL インジェクションに対して広くオープンです。

于 2008-09-02T15:27:25.903 に答える