我有两个表,分别命名为“供应商”和“联系人”。
联系人表中的数据对应于供应商表中的一条记录。
供应商数据
| id | 姓名 |
|---|---|
| 1 | 马力 |
| 2 | 华为 |
联系人数据
| id | 供应商ID | 联系 |
|---|---|---|
| 1 | 1 | 约翰 |
| 2 | 1 | 史密斯 |
| 3 | 1 | 会 |
| 4 | 2 | 美国能源部 |
| 5 | 2 | 灯芯 |
现在,我想做一个应返回以下结果的查询
| id | 姓名 | 联系 |
|---|---|---|
| 1 | 马力 | 约翰、史密斯、威尔 |
| 2 | 华为 | 美国能源部,威克 |
或者应该返回以下结果
| id | 姓名 | 联系 | 联系 | 联系 |
|---|---|---|---|---|
| 1 | 马力 | 约翰 | 史密斯 | 会 |
| 2 | 华为 | 美国能源部 | 灯芯 |
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
您可以使用 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。