SQL 从主表 - 详细表中选择(格式化数据)
P粉904191507
P粉904191507 2024-03-27 22:03:16
0
1
385

我有两个表,分别命名为“供应商”和“联系人”。

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

供应商数据

id 姓名
1 马力
2 华为

联系人数据

id 供应商ID 联系
1 1 约翰
2 1 史密斯
3 1
4 2 美国能源部
5 2 灯芯

现在,我想做一个应返回以下结果的查询

id 姓名 联系
1 马力 约翰、史密斯、威尔
2 华为 美国能源部,威克

或者应该返回以下结果

id 姓名 联系 联系 联系
1 马力 约翰 史密斯
2 华为 美国能源部 灯芯

P粉904191507
P粉904191507

全部回复(1)
P粉124890778

您可以使用 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。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!