2014-07-05 4 views
7

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

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

Ce que je suis aux prises avec est une façon de mettre à jour les dossiers que je l'ai choisi, une fois sélectionné, je dois changer la status = '1' afin que la prochaine fois que mon script est exécuté, il ne tire pas les mêmes données dans la sélectionnez et ne tirez que les nouveaux éléments de la table qui ont le statut 2.

Ceci 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); 
} 
+2

Exécuter la requête de mise à jour après la sélection de la requête –

+0

OK, Désolé, j'apprends MySQL. Si je faisais une mise à jour séparée après la sélection, je pourrais techniquement changer un produit qui aurait pu être ajouté après la sélection qui ne serait pas disponible pour la prochaine exécution du script? Si ça a du sens. – TheWebsiteGuy

+0

Pas si vous mettez à jour uniquement les SKU que vous avez sélectionnés en premier lieu. – ESG

Répondre

4

Si supplier_dropship_items a une clé primaire (il devrait), alors inclure ces champs dans le SELECT, puis, lorsque vous faire défiler les résultats, exécutez une UPDATE en utilisant 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'êtes pas exécuté dans un environnement concurrent. Si vous êtes, vous devez verrouiller les enregistrements pour la mise à jour, en utilisant SELECT... FOR UPDATE. Vous pouvez lire à ce sujet here. Pour autant que je sache, cela fonctionne sous MySQL sur les tables InnoDB.

+0

vous pouvez également verrouiller les tables afin que l'ordre ne provoque pas un blocage (dans InnoDB). 'LOCK TABLES supplier_dropship_items WRITE' –

+0

Merci @Marion C'Ascanio, cela fonctionne parfaitement et plus important encore je le comprends :) Je vais ajouter le résultat à la question à titre de référence – TheWebsiteGuy

+0

Super, @ Innov8! Content de pouvoir aider! –

10

faites simplement la mise à jour lorsque vous le sélectionnez en même temps.

changer cette ...

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

à ceci:

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 

Ceci suppose que vous avez une colonne d'identité dans votre table comme cela est la façon dont il devrait être mis en place et comment toute normalisée table ressemblerait

+0

Salut @ John Ruddell, je viens de tester cela et bien qu'il ait mis à jour les éléments sélectionnés, ils ne sont pas passés à '$ result' pour que je puisse les utiliser dans mon script php? – TheWebsiteGuy

+0

ok alors il suffit d'exécuter la requête avant d'exécuter la mise à jour. Fondamentalement, il suffit de lancer votre requête de sorte que vous l'avez dans $ result et ensuite mettre à jour la table par la suite si cela a du sens. –

+0

Cette syntaxe entraîne des erreurs sur mon serveur MySQL: 1. Une expression était attendue. (near "(" à la position 39) 2. Jeton inattendu (près de "(" en position 39) 3. Une nouvelle instruction a été trouvée, mais pas de délimiteur entre celle-ci et la précédente (près de "SELECT" à la position 46) –