如何使用 MySQL 展平左连接的结果?

Posted

技术标签:

【中文标题】如何使用 MySQL 展平左连接的结果?【英文标题】:How can I flatten results from left join using MySQL? 【发布时间】:2013-08-14 16:01:22 【问题描述】:

我正在尝试创建一个查询,其中我将一个 USER 表与一个 ADDRESS_BOOK 表连接起来,其中 1 个用户可能有多个地址(即帐单、送货)。每个地址都是ADDRESS_BOOK 表中自己的条目。

ADDRESS_BOOK 表中的每个条目都有一个 USER_ID 值,对应于 USER 表中的一个条目。

我想得到以下结果:

____________________________
USER ID | BILLING | SHIPPING

现在每个USER_ID 得到两个结果,一个是SHIPPING 地址,一个是BILLING 地址。我需要每个USER_ID 得到一个结果,其中SHIPPINGBILLING 信息(两个查询结果)被展平。

【问题讨论】:

【参考方案1】:

使用GROUP BY 按用户ID 对行进行分组,然后使用GROUP_CONCAT 将所有条目作为一行。使用以下示例(我使用 fullname 而不是用户 ID 只是为了更容易看):

CREATE TABLE user (
       user_id INT AUTO_INCREMENT PRIMARY KEY,
       fullname VARCHAR(32)
);

CREATE TABLE billing (
       user_id INT,
       billing VARCHAR(128)
);

CREATE TABLE shipping (
       user_id INT,
       shipping VARCHAR(128)
);

INSERT INTO user(fullname) VALUES ('Susan');
SET @last_id = LAST_INSERT_ID();
INSERT INTO billing VALUES
       (@last_id, 'Box 123');
INSERT INTO shipping VALUES
       (@last_id, '123 Oak Street'),
       (@last_id, '234 Pine Street');
INSERT INTO user(fullname) VALUES ('Mike');
SET @last_id = LAST_INSERT_ID();
INSERT INTO billing VALUES
       (@last_id, 'Box 12'),
       (@last_id, 'Deep Mine 3');
INSERT INTO shipping VALUES
       (@last_id, '4711 Iron Road');

这个选择语句

SELECT fullname
     , group_concat(shipping)
     , group_concat(billing)
  FROM user JOIN billing USING (user_id)
            JOIN shipping USING (user_id)
GROUP BY fullname;

会给出这个结果:

+----------+--------------------------------+--------------------+
| fullname | Shipping                       | Billing            |
+----------+--------------------------------+--------------------+
| Mike     | 4711 Iron Road,4711 Iron Road  | Box 12,Deep Mine 3 |
| Susan    | 234 Pine Street,123 Oak Street | Box 123,Box 123    |
+----------+--------------------------------+--------------------+
2 rows in set (0.00 sec)

【讨论】:

【参考方案2】:

这可能会有所帮助:

SELECT U.USER_ID,  
(SELECT ADDRESS FROM ADDRESS_BOOK WHERE USER_ID = U.USER_ID AND ADDRESS_TYPE = 'BILLING') AS BILLING,  
(SELECT ADDRESS FROM ADDRESS_BOOK WHERE USER_ID = U.USER_ID AND ADDRESS_TYPE = 'SHIPPING') AS SHIPPING 
FROM USER U;

【讨论】:

以上是关于如何使用 MySQL 展平左连接的结果?的主要内容,如果未能解决你的问题,请参考以下文章

如何正确连接两个一维数组而不展平?

如何展平嵌套的结果?

Laravel 6,MYSQL - 如何使用 Laravel Querybuilder 或 Model Eloquent 将子查询与 GroupBY 左连接?

如何展平来自聚合输出的 JSON 结果

mysql 多张表做左连接操作 SQL应该如何写

Numpy 数组:连接展平和添加维度