mariadb SQL从主从表中选择(格式化数据)

vi4fp9gy  于 2022-11-08  发布在  其他
关注(0)|答案(2)|浏览(116)

我有两个表,分别命名为supplier和contacts。
contact表中的数据对应于supplier表中的记录。
供应商资料
| 识别码|名称名称名称|
| - -|- -|
| 一个|幽门螺杆菌|
| 2个|华为公司|
联系人的数据
| 标识符|供应商ID|联络人|
| - -|- -|- -|
| 一个|一个|若翰|
| 2个|一个|史密斯公司|
| 三个|一个|威尔|
| 四个|2个|多伊|
| 五个|2个|威克|
现在,我想进行一个查询,该查询应返回以下结果
| 识别码|名称名称名称|联络人|
| - -|- -|- -|
| 一个|幽门螺杆菌|约翰史密斯威尔|
| 2个|华为公司|多伊威克|
或者应该返回以下结果
| 识别码|名称名称名称|联络人|联络人|联络人|
| - -|- -|- -|- -|- -|
| 一个|幽门螺杆菌|若翰|史密斯公司|威尔|
| 2个|华为公司|多伊|威克||

voj3qocg

voj3qocg1#

你可以使用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;

如果每个供应商有三个以上的客户,则第二个查询可能不起作用。在这种情况下,您可以修改查询以包含可能的最大供应商数量,或者使用预准备语句。如果确实需要这样的解决方案,请在下面留下注解。
为了更好地理解,您可以使用这些解决方案here。第一个解决方案适用于任何MySQL版本,而第二个解决方案适用于MySQL 8。

aydmsdu9

aydmsdu92#

查询以显示所需的表:

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

相关问题