SQL UPDATE multiples en 1 commande

Fermé
hypo - 4 juin 2021 à 15:42
 hypo - 4 juin 2021 à 18:33
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:


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 ?
A voir également:

1 réponse

jee pee Messages postés 40985 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 1 avril 2025 9 575
4 juin 2021 à 16:16
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") 

1
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/
0
jee pee Messages postés 40985 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 1 avril 2025 9 575 > hypo
Modifié le 4 juin 2021 à 17:04
c'est pas meta_key qu'il faut utiliser comme critère de recherche de l'enregistrement ?????????
0
hypo > jee pee Messages postés 40985 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 1 avril 2025
4 juin 2021 à 17:20
Sur le screen c'est 1 seul enregistrement, identifiable par son post_id (j'ai juste fait un select * from wp_postmeta where post_id = "210" pour visualiser le cas de notre exemple)
0
jee pee Messages postés 40985 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 1 avril 2025 9 575 > hypo
4 juin 2021 à 17:40
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") 
0
hypo > jee pee Messages postés 40985 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 1 avril 2025
4 juin 2021 à 18:16
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) ?
0