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

Kat*_*umi 3 mysql select join subquery left-join

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

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

我想得到以下结果:

____________________________
USER ID | BILLING | SHIPPING
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*ahl 5

用于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');
Run Code Online (Sandbox Code Playgroud)

这个选择语句

SELECT fullname
     , group_concat(shipping)
     , group_concat(billing)
  FROM user JOIN billing USING (user_id)
            JOIN shipping USING (user_id)
GROUP BY fullname;
Run Code Online (Sandbox Code Playgroud)

会给出这样的结果:

+----------+--------------------------------+--------------------+
| 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)
Run Code Online (Sandbox Code Playgroud)