Heim > Fragen und Antworten > Hauptteil
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粉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。