【问题标题】:How can I flatten results from left join using MySQL?如何使用 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 信息(两个查询结果)被展平。

【问题讨论】:

    标签: mysql select join subquery left-join


    【解决方案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;
      

      【讨论】:

        猜你喜欢
        • 2011-02-23
        • 2021-03-22
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 2021-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多