2011-11-14 7 views
2

テーブルの特定の行を番号の小さい順に更新するコードを記述しました。正しい行を選択するには、私は2つのテーブルを結合する必要があります。テーブルの最後の行は0の値を持ち、2番目の値は-1です。これを達成するために私はORDER BY DESCを使用します。私の読書は、私は、UPDATEを使用して、一緒BY JOINとORDERことができないことを示唆しているUPDATEとORDER BYの不正な使用

BY UPDATEおよびORDERの

誤った使用方法:残念ながら、私のコードは次のようなエラーが表示されます。サブクエリが助けになるかもしれないと私は読んだことがありますか?私はこれを行うために私のコードをどのように変更するか考えていません。おそらく誰かが修正版を投稿してうまくいくでしょうか?

while($row = mysql_fetch_array($result)) { 

$products_id = $row['products_id']; 
$products_stock_attributes = $row['products_stock_attributes']; 

mysql_query("SET @i = 0"); 

$result2 = mysql_query("UPDATE orders_products op, orders ord 

        SET op.stock_when_purchased = (@i:=(@i - op.products_quantity)) 
        WHERE op.orders_id = ord.orders_id 
AND op.products_id = '$products_id' 
AND op.products_stock_attributes = '$products_stock_attributes' 
AND op.stock_when_purchased < 0 
AND ord.orders_status = 2 

ORDER BY orders_products_id DESC") 
or die(mysql_error()); 
} 

答えて

0

なぜあなたはアップデートで注文する必要がありますか?私はあなたが単にそれを削除することができると思うあなたはあなたのwhereステートメントを尊重するすべての更新プログラムを更新します。

EDIT:そして、多分あなたはあなたがあなたのwhile($row = mysql_fetch_assoc($query)){ループ内で、その後の行をループにSELECT呼び出しを使用して、そこにあなたのWHEREORDER BYステートメントを含めると、可能性があなたのコード

+1

ORDER BYを使用しない場合、番号シーケンスは間違った方向になります。 – nico55555

+0

UPDATEステートメントのORDER BYは、並行性の高い環境で行ロック・テーブルにデッドロックが発生しないようにするのに便利です – Spredzy

+0

order byを使用して、一意の制約を持つ列を変更して、競合するキーには当たらない。たとえば、優先順位またはシーケンスの列がある場合、特定の値を超えるすべてのシーケンス番号を減らすことが望ましい場合があります。その列で昇順に注文すれば、重複するキーがないことを確認できます。 – jcbwlkr

0

を簡素化するためにストアドプロシージャを呼び出すことができますあなたのUPDATE table SET key = 'value' WHERE id = '{$row['id']}'声明があります。

確かにこれは多くの場合mysql_query()を実行する必要がありますが、それでも速度はかなり速く、単一のクエリでは高速ではありません。

1

あなたのUPDATEステートメントでORDER BYを削除し、それをSELECTステートメントに入れてください。

サンプル:

$query = "SELECT ........ ORDER BY ..." 
$result = mysql_query($query); 

while(....){.... } 

UPDATE文の文句を言わないORDER BY句を受け入れます。

関連する問題