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);
}
supplier_dropship_items
に主キーがある場合(そうでなければなりません)、それらのフィールドをSELECT
に含め、結果を循環するときに、 UPDATE
主キーを使用してstatus
を設定します。
UPDATE supplier_dropship_items SET status=1 WHERE <id_field>=<id_value>;
これは、並行環境で実行していないことを前提としています。その場合は、SELECT... FOR UPDATE
を使用して、更新のためにレコードをロックする必要があります。あなたはそれについて読むことができます ここ 。私の知る限り、これはMySQLのInnoDBテーブルで動作します。
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列があることを前提としています。