web-dev-qa-db-ja.com

MySQL-選択してから更新

PHPで記述されたスクリプトがあります。この行には、必要なデータを選択するために正しく機能している行があります。

$result = mysql_query("SELECT product_name, sku, qty FROM supplier_dropship_items WHERE supplier_id = '3' AND status = '2'", $db_beb);

私が苦労しているのは、選択したレコードを更新する方法です。選択したら、status = '1'次回のスクリプト実行時に、select内の同じデータはプルされず、ステータスが2のテーブル内の新しいアイテムのみがプルされます。

これは、以下の承認された回答のコメントのおかげで私の作業結果です。

$result = mysql_query("SELECT id, product_name, sku, qty FROM supplier_dropship_items WHERE supplier_id = '3' AND status = '2' FOR UPDATE", $db_beb); 

while($row = mysql_fetch_assoc($result)) 
{ 
    $sql_table_data[] = $row;
    mysql_query("UPDATE supplier_dropship_items SET status=1 WHERE id='".$row['id']."'", $db_beb); 
} 
14
TheWebsiteGuy

supplier_dropship_itemsに主キーがある場合(そうでなければなりません)、それらのフィールドをSELECTに含め、結果を循環するときに、 UPDATE主キーを使用してstatusを設定します。

UPDATE supplier_dropship_items SET status=1 WHERE <id_field>=<id_value>;

これは、並行環境で実行していないことを前提としています。その場合は、SELECT... FOR UPDATEを使用して、更新のためにレコードをロックする必要があります。あなたはそれについて読むことができます ここ 。私の知る限り、これはMySQLのInnoDBテーブルで動作します。

6

UPDATEと同時にSELECTを実行するだけです。

これを変える:

SELECT product_name, sku, qty 
FROM supplier_dropship_items 
WHERE supplier_id = '3' AND status = '2';

これに:

UPDATE supplier_dropship_items as t, 
(
    SELECT id, product_name, sku, qty 
    FROM supplier_dropship_items 
    WHERE supplier_id = '3' AND status = '2'
) as temp
SET status = '1' WHERE temp.ID = t.ID;

これは、テーブルを設定する方法と正規化されたテーブルがどのようになるかを示すため、テーブル内にID列があることを前提としています。

19
John Ruddell