SQL UPDATE multiples en 1 commande
hypo
-
hypo -
hypo -
Bonjour,
Pour un wordpress, je tente d'optimiser un script de mise a jour des stock dans woocommerce. Je bloque sur le cas suivant:
J'ai un tableau de donnée PHP qui contien le code barre, le stock disponible (uniquement si positif), et l'id du post:
Je dois mettre a jour les 2155 stock et leur status dans wp_postmeta comme suit (pour le premier cas par exemple):
puis:
Donc 2 requêtes SQL pour 1 article. J'ai beau regarder la doc je trouve pas d'opérateur sql qui pourrait passer la mise a jour de tout les articles en une seule commande. Est-ce possible ?
Pour un wordpress, je tente d'optimiser un script de mise a jour des stock dans woocommerce. Je bloque sur le cas suivant:
J'ai un tableau de donnée PHP qui contien le code barre, le stock disponible (uniquement si positif), et l'id du post:
array(2155) { [0]=> array(3) { [0]=> string(13) "9782813808240" [1]=> string(1) "8" [2]=> string(3) "210" } [1]=> array(3) { [0]=> string(13) "9781409540380" [1]=> string(1) "1" [2]=> string(3) "212" } .... }
Je dois mettre a jour les 2155 stock et leur status dans wp_postmeta comme suit (pour le premier cas par exemple):
UPDATE wp_postmeta SET meta_value = "instock" WHERE post_id = "210" AND meta_value = "_stock_status"
puis:
UPDATE wp_postmeta SET meta_value = "8" WHERE post_id = "210" AND meta_value = "_stock"
Donc 2 requêtes SQL pour 1 article. J'ai beau regarder la doc je trouve pas d'opérateur sql qui pourrait passer la mise a jour de tout les articles en une seule commande. Est-ce possible ?
1 réponse
-
Bonjour,
A essayer quelque chose comme :UPDATE wp_postmeta SET meta_value = CASE meta_value WHEN "_stock_status" THEN "instock" WHEN "_stock" THEN "8" END CASE WHERE post_id = "210" AND meta_value IN ("_stock_status", "_stock")
-
Bonjour, merci pour votre réponse,
Alors pour la ligne 4 il y avait une erreur donc une fois corrigée:
UPDATE wp_postmeta SET meta_value = CASE meta_value WHEN "_stock_status" THEN "instock" WHEN "_stock" THEN "8" END WHERE post_id = "210" AND meta_value IN ("_stock_status", "_stock")
Mais en l'occurence j'ai "0 rows affected"
Je join un screen de la table si ça peut aider:
https://metasbooks.fr/screen/ -
-
-
tu sais que c'est risqué les mises à jour de masse quand on ne maitrise pas le modèle des données ? En plus tu sembles être dans un cas où c'est une structure qui n'est pas faite pour un bon modèle relationnel, pour récupérer toutes les données de l'id 210 il faudrait un sql JOIN 25 fois sur la même table.
tu fais une sauvegarde de la base avant ?
Moi de ce que je vois je ferais plutôt
UPDATE wp_postmeta SET meta_value = CASE meta_key WHEN "_stock_status" THEN "instock" WHEN "_stock" THEN "8" END WHERE post_id = "210" AND meta_key IN ("_stock_status", "_stock") -
Ah nikel ça !
Bon a ce stade on peut donc divisser par 2 la vitesse de traitement. Mais mon soucis c'est que dans ce fichier j'ai asser peut de référence (ici c'est ma petite librairie de campagne avec donc 2155 ref en stock) mais pour des grosses librairies ça risque de prendre 3 plombes, c'estpour ça que je voulais passer le tout en 1 requête, il y a moyen de coller des requete pour éviter de boucler dans php (ou plutot boucler sur une chaine a laquelle on ajoute les requetes qu'on envoie a sql qu'a la fin du traitement) ?
-