Requête multiple sur plusieurs tables [Résolu]

Messages postés
15
Date d'inscription
jeudi 14 février 2019
Statut
Membre
Dernière intervention
17 septembre 2019
-
Bonjour,

Je souhaiterais de l'aide concernant une requête multiple qui nécessite de faire une jointure entre trois tables.

Les voici :

ps_orders
- id_order - INT
- payment - VARCHAR (qui comporte le nom de plsrs moyens de remboursement ex:paypal..)

payment_method
- id_payment_method - INT
- name - VARCHAR (comporte le nom de ces moyens de remboursement ex:paypal..)

order_refund
- id_order - INT
- id_payment_method - INT (ne comporte rien encore)

Je souhaite insérer dans la colonne id_payment_method deorder_refund une valeur numérique et qu'elle y soit associé à la méthode de remboursement associée.

Pour cela je dois,
récuperer l'id_order de order_refund et le comparer à celui de ps_orders, si ceux-ci sont identiques alors je récupère la méthode de remboursement associée ( - payment - varchar ) (de ps_orders) et la compare à celui de - name - (de payment_method) et récupère l'id associé. Je retourne celui-ci dans la colonne encore vierge ( - id_payment_method - de order_refund) qui attend absolument un integer.

Je n'ai pas d'autre choix que de faire cela, j'ai déjà tester des requêtes à base de INSERT INTO et JOIN mais je suis un peu perdu. Quelqu'un aurait bien une idée de la formulation ?

Merci par avance !
Afficher la suite 

1 réponse

Messages postés
26637
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
17 septembre 2019
5485
0
Merci
Bonjour,

Un insert c'est pour ajouter une nouvelle ligne, pour mettre à jour un champ c'est un update.

update order_refund AS ORD
set id_payment_method = (select PM.id_payment_method
                         from payment_method AS PM
                         inner join ps_order as PS on PS.payment = PM.name
                         where PS.id_order = ORD.id_order)
where id_payment_method is null

Cdlt
emmmmmy
Messages postés
15
Date d'inscription
jeudi 14 février 2019
Statut
Membre
Dernière intervention
17 septembre 2019
-
Dans mes fichiers de migrations, les requêtes sont sous forme d' INSERT mais je pense qu'il est mieux de passer par un UPDATE effectivement. Votre solution est intéressante merci beaucoup, je vais la tester.
jee pee
Messages postés
26637
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
17 septembre 2019
5485 > emmmmmy
Messages postés
15
Date d'inscription
jeudi 14 février 2019
Statut
Membre
Dernière intervention
17 septembre 2019
-
si l'enregistrement n'existe pas
INSERT INTO order_refund (id_order, id_payment_method) 
SELECT PS.id_order, PM.id_payment_method 
FROM ps_order as PS
inner join payment_method AS PM on PS.payment = PM.name
emmmmmy
Messages postés
15
Date d'inscription
jeudi 14 février 2019
Statut
Membre
Dernière intervention
17 septembre 2019
-
J'ai aussi essayé de le faire ! Merci pour votre aide mais la requête n'est pas valide sur workbench. Ça me dit que la jointure n'a pas sa place après le SET, et je ne trouve pas d'exemple avec une jointure après un SET, est-ce possible ? Il me dit aussi que mes tables sous alias ne sont pas retrouvées. -_- Grrrrrrr
jee pee
Messages postés
26637
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
17 septembre 2019
5485 > emmmmmy
Messages postés
15
Date d'inscription
jeudi 14 février 2019
Statut
Membre
Dernière intervention
17 septembre 2019
-
dans mon sql il n'y a pas de set ? c'est bien celui là qui correspond au message d'erreur
emmmmmy
Messages postés
15
Date d'inscription
jeudi 14 février 2019
Statut
Membre
Dernière intervention
17 septembre 2019
-
UPDATE order_refund
            INNER JOIN (SELECT DISTINCT pso.id_order,
                                          pso.payment,
                                          pm.id_payment_method
            FROM ps_orders pso
            LEFT JOIN payment_method pm ON pm.name=pso.payment
            ) AS sub
            ON sub.id_order = order_refund.id_order
            SET order_refund.id_payment_method = sub.id_payment_method;


Voici la requête qui fonctionne !


EDIT : Ajout des balises de code
Commenter la réponse de jee pee