recherche

Maison  >  Questions et réponses  >  le corps du texte

SQL Sélectionner à partir de la table principale - table détaillée (données formatées)

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粉904191507P粉904191507237 Il y a quelques jours417

répondre à tous(1)je répondrai

  • P粉124890778

    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.

    répondre
    0
  • Annulerrépondre