Merger les resultats d'une jointure multiple

Résolu/Fermé
Exileur Messages postés 1475 Date d'inscription mercredi 31 août 2011 Statut Membre Dernière intervention 16 décembre 2022 - 20 juil. 2020 à 18:43
Exileur Messages postés 1475 Date d'inscription mercredi 31 août 2011 Statut Membre Dernière intervention 16 décembre 2022 - 20 juil. 2020 à 19:04
Hello Hello,

Me voila bien en galére sur postgres dont je ne suis pas specialement famillier ...
J'ai trois tables:
Table clients
+----+-------+
| id | name |
+----+-------+
| 1 | user1 |
| 2 | user2 |
| 3 | user3 |
| 4 | user4 |
+----+-------+

Table products
+----+----------+
| id | name |
+----+----------+
| 1 | service1 |
| 2 | service2 |
| 3 | service3 |
| 4 | service4 |
+----+----------+

Table commands
+----+-----------+------------+
| id | id_client | id_product |
+----+-----------+------------+
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 1 |
| 4 | 2 | 3 |
| 5 | 3 | 4 |
+----+-----------+------------+


Je souhaite que le résultat de ma jointure ressemble à ça mais impossible d'y parvenir :
 Résultat attendu
+--------+------------------------------+
| USER | PRODUCT(S) |
+--------+------------------------------+
| user1 | service1, service2 |
| user2 | service1, service3 |
| user3 | service4 |
| user4 | service1, service2, service3 |
+--------+------------------------------+



Voila la commande que j'utilise et son résultat :
SELECT users.name as "USER", products.name as "PRODUCT(S)"
FROM users
LEFT JOIN commands ON users.id = commands.id_client
INNER JOIN products ON commands.id_product = products.id
ORDER BY users.name ASC;

Résultat obtenue
+-------+------------+
| USER | PRODUCT(S) |
+-------+------------+
| user1 | service1 |
| user1 | service2 |
| user2 | service1 |
| user2 | service3 |
| user3 | service4 |
etc...


En mysql j'aurai utilisé GROUP_CONCAT mais qui n'est pas une fonction postgres valide.
j'ai tenté le GROUP BY clients.name mais il me sors une erreur et veux que je rajoute égallement le champ products.name du coup il me fait juste une sorte de ORDER_BY mais ne concaténe pas les résultats
j'ai tenté un SELECT DISTINCT(clients.name) mais il me sort uniquement le premier produit commandé par l'utilisateur....
Je commence à secher et mes connaissances postgres sont trop faible.

Un connaisseur peut il m'aider ? :)
Merci d'avance

2 réponses

RV71 Messages postés 509 Date d'inscription mardi 14 avril 2020 Statut Membre Dernière intervention 15 avril 2024 31
20 juil. 2020 à 18:59
Bonjour,
je ne connais pas du tout, mais ceci semble répondre à ta problématique :
https://www.postgresqltutorial.com/postgresql-aggregate-functions/postgresql-array_agg-function/

A+
1
Exileur Messages postés 1475 Date d'inscription mercredi 31 août 2011 Statut Membre Dernière intervention 16 décembre 2022 150
20 juil. 2020 à 19:03
Merci pour ta réponse, je vais me cultiver un peu plus et lire ce que tu m'a envoyé !!
0
Exileur Messages postés 1475 Date d'inscription mercredi 31 août 2011 Statut Membre Dernière intervention 16 décembre 2022 150
20 juil. 2020 à 18:58
Bon, il a suffit que je pose la question ici pour trouver la réponse ....

Voila ce que j'utilise comme commande pour obtenir le résultat attendu :
 SELECT users.name as "USER", string_agg(DISTINCT products.name, ', ') as "PRODUCT(S)"
FROM users
LEFT JOIN commands ON users.id = commands.id_client
INNER JOIN products ON commands.id_product = products.id
GROUP BY users.name
ORDER BY users.name ASC;

 +--------+------------------------------+
| USER | PRODUCT(S) |
+--------+------------------------------+
| user1 | service1, service2 |
| user2 | service1, service3 |
| user3 | service4 |
| user4 | service1, service2, service3 |
+--------+------------------------------+


Je clos la demande qui est résolue.
0
Exileur Messages postés 1475 Date d'inscription mercredi 31 août 2011 Statut Membre Dernière intervention 16 décembre 2022 150
20 juil. 2020 à 19:04
0