web-dev-qa-db-fra.com

MySQL - SELECT puis UPDATE

J'ai un script écrit en PHP qui a cette ligne qui fonctionne correctement pour sélectionner les données dont j'ai besoin;

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

Ce qui me pose problème, c'est un moyen de mettre à jour les enregistrements que j'ai sélectionnés, une fois sélectionné, je dois changer le status = '1' afin que la prochaine fois que mon script s'exécute, il ne récupère pas les mêmes données dans la sélection et ne récupère que les nouveaux éléments dans le tableau qui ont le statut 2.

C'est mon résultat de travail grâce aux commentaires de la réponse acceptée ci-dessous;

$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

Si supplier_dropship_items a une clé primaire (elle devrait), puis incluez ces champs dans SELECT, puis, lorsque vous parcourez les résultats , exécutez un UPDATE à l'aide de la clé primaire pour définir le status, comme dans:

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

Cela suppose que vous n'exécutez pas dans un environnement simultané. Si vous l'êtes, vous devez verrouiller les enregistrements pour la mise à jour en utilisant SELECT... FOR UPDATE. Vous pouvez en lire plus ici . Pour autant que je sache, cela fonctionne sous MySQL sur les tables InnoDB.

6
Mariano D'Ascanio

Faites simplement le UPDATE lorsque vous SELECT en même temps.

Change ça:

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

pour ça:

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;

Cela suppose que vous avez une colonne ID à l'intérieur de votre table car c'est ainsi qu'elle devrait être configurée et à quoi ressemblerait une table normalisée.

19
John Ruddell