我有两个表,名为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;