SQL Select From Master语言 - Detail Tables(格式化数据)



我有两个表,名为supplier和contacts。

联系人表中的数据对应供应商表中的记录。

供应商资料

<表类> ID 名称 tbody><<tr>1惠普2华为

您可以使用MySQLGROUP_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通过对供应商进行分区来为联系人表中的每一行分配一个等级。然后使用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。

按您希望的方式显示表的查询:

SELECT supplier.ID, supplier.Name, contact.Contact 
FROM supplier 
INNER JOIN contact 
ON supplier.ID = contact.supplierId;

相关内容

  • 没有找到相关文章

最新更新