SQL UPDATE multiples en 1 commande

Signaler
-
 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:


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

Messages postés
32215
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
21 juin 2021
7 756
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") 

Messages postés
32215
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
21 juin 2021
7 756 > hypo
c'est pas meta_key qu'il faut utiliser comme critère de recherche de l'enregistrement ?????????
>
Messages postés
32215
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
21 juin 2021

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)
Messages postés
32215
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
21 juin 2021
7 756 > hypo
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") 
>
Messages postés
32215
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
21 juin 2021

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) ?
Ah non au temps pour moi ça prend même pas 2s pour 2k entrée donc bon c'est nikel merci beaucoup pour ton aide et bonne soirée !