Maison > Questions et réponses > le corps du texte
J'ai deux tables nommées "Fournisseurs" et "Contacts".
Les données de la table des contacts correspondent à un enregistrement de la table des fournisseurs.
Données fournisseurs
id | Nom |
---|---|
1 | Puissance |
2 | Huawei |
Données de contact
id | ID fournisseur | Contact |
---|---|---|
1 | 1 | Jean |
2 | 1 | Smith |
3 | 1 | Volonté |
4 | 2 | Département américain de l'énergie |
5 | 2 | Mèche |
Maintenant, je souhaite faire une requête qui devrait renvoyer les résultats suivants
id | Nom | Contact |
---|---|---|
1 | Puissance | John, Smith, Will |
2 | Huawei | Département américain de l'énergie, Wake |
Ou les résultats suivants devraient être renvoyés
id | Nom | Contact | Contact | Contact |
---|---|---|---|---|
1 | Puissance | Jean | Smith | Volonté |
2 | Huawei | Département américain de l'énergie | Mèche |
P粉1248907782024-03-28 09:13:08
Vous pouvez utiliser MySQL GROUP_CONCAT
聚合函数来获取您的第一个输出表。它自己的 ORDER BY
la clause vous permettra de vérifier l'ordre de concaténation des lignes.
SELECT s.ID, s.Name, GROUP_CONCAT(c.Contact ORDER BY c.id) FROM Supplier s INNER JOIN Contact c ON s.ID = c.supplierId GROUP BY s.ID, s.Name
Vous pouvez utiliser les fonctions de fenêtre ROW_NUMBER
通过对供应商进行分区来为 Contact 表中的每一行分配排名。然后使用 IF
语句将联系人分成三列,该语句将检查排名的三个可能值。 MAX
Les fonctions d'agrégation vous permettront de supprimer les valeurs nulles.
SELECT s.ID, s.Name, MAX(IF(c.rn = 1, c.Contact, NULL)) AS Contact1, MAX(IF(c.rn = 2, c.Contact, NULL)) AS Contact2, MAX(IF(c.rn = 3, c.Contact, NULL)) AS Contact3 FROM Supplier s INNER JOIN (SELECT *, ROW_NUMBER() OVER(PARTITION BY supplierId ORDER BY id) AS rn FROM Contact ) c ON s.ID = c.supplierId GROUP BY s.ID, s.Name;
La deuxième requête peut ne pas fonctionner s'il y a plus de trois clients par fournisseur. Dans ce cas, vous pouvez modifier la requête pour inclure le nombre maximum de fournisseurs possible ou utiliser une instruction préparée. Si vous avez vraiment besoin d'une telle solution, veuillez laisser un commentaire ci-dessous.
Pour une meilleure compréhension, vous pouvez utiliser ces solutions ici. La première solution fonctionne avec n'importe quelle version de MySQL, tandis que la seconde solution fonctionne avec MySQL 8.