Merger les resultats d'une jointure multiple
Résolu
Exileur
Messages postés
1621
Date d'inscription
Statut
Membre
Dernière intervention
-
Exileur Messages postés 1621 Date d'inscription Statut Membre Dernière intervention -
Exileur Messages postés 1621 Date d'inscription Statut Membre Dernière intervention -
Hello Hello,
Me voila bien en galére sur postgres dont je ne suis pas specialement famillier ...
J'ai trois tables:
Je souhaite que le résultat de ma jointure ressemble à ça mais impossible d'y parvenir :
Voila la commande que j'utilise et son résultat :
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
--
N'oubliez pas de marquez votre post comme résolut lorsque vous avez eu les réponses à vos questions...
Au royaume des aveugles, les borgnes sont rois.
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
--
N'oubliez pas de marquez votre post comme résolut lorsque vous avez eu les réponses à vos questions...
Au royaume des aveugles, les borgnes sont rois.
2 réponses
-
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+ -
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.