Heim  >  Fragen und Antworten  >  Hauptteil

SQL-Auswahl aus Haupttabelle – Detailtabelle (formatierte Daten)

Ich habe zwei Tabellen mit den Namen „Lieferanten“ und „Kontakte“.

Die Daten in der Kontakttabelle entsprechen einem Datensatz in der Lieferantentabelle.

Lieferantendaten

id Name
1 Pferdestärke
2 Huawei

Kontaktdaten

id Lieferanten-ID Kontakt
1 1 John
2 1 Smith
3 1 Wird
4 2 US-Energieministerium
5 2 Wick

Jetzt möchte ich eine Abfrage erstellen, die die folgenden Ergebnisse zurückgeben soll

id Name Kontakt
1 Pferdestärke John, Smith, Will
2 Huawei US-Energieministerium, Wake

Oder die folgenden Ergebnisse sollten zurückgegeben werden

id Name Kontakt Kontakt Kontakt
1 Pferdestärke John Smith Wird
2 Huawei US-Energieministerium Wick

P粉904191507P粉904191507205 Tage vor389

Antworte allen(1)Ich werde antworten

  • P粉124890778

    P粉1248907782024-03-28 09:13:08

    您可以使用 MySQL GROUP_CONCAT 聚合函数来获取您的第一个输出表。它自己的 ORDER BY 子句将允许您检查行的串联顺序。

    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

    您可以使用窗口函数 ROW_NUMBER 通过对供应商进行分区来为 Contact 表中的每一行分配排名。然后使用 IF 语句将联系人分成三列,该语句将检查排名的三个可能值。 MAX 聚合函数将允许您删除空值。

    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;

    如果每个供应商有超过三个客户,第二个查询可能不起作用。在这种情况下,您可以修改查询以包含可能的最大供应商数量,或者使用准备好的语句。如果您确实需要这样的解决方案,请在下面发表评论。

    为了更好地理解,您可以在此处使用这些解决方案。第一个解决方案适用于任何 MySQL 版本,而第二个解决方案适用于 MySQL 8。

    Antwort
    0
  • StornierenAntwort