【问题标题】:Get records from one table and a corresponding table从一个表和对应的表中获取记录
【发布时间】:2016-07-05 09:57:24
【问题描述】:

我有两张桌子:

orders
poid | user | pid | payment_id
1    | 1    | 1   | abc123
2    | 2    | 2   | def345

orders_addon
poaid | user | poid | pid
1     | 1    | 1    | 3
2     | 1    | 1    | 5

一个代表订单,第二个代表用户可以添加到他的订单的插件。

订单中总是有一行,并且可能会出现订单没有匹配的orders_addon。

我正在寻找一个查询,如果有匹配的,则返回来自 orders 和 orders_addon 的匹配行。

SELECT user,pid FROM ... WHERE payment_id = 'abc123'

应该返回

user | pid
1    | 1
1    | 3
1    | 5

如果orders_addon 表中没有匹配的记录,相同的查询应该只返回orders 表中的结果。

SELECT user,pid FROM ... WHERE payment_id = 'def345'

user | pid
2    | 2

我认为这可以使用 UNION 来完成,但是我将无法匹配这些表,这将成为一个问题,因为 orders_addon 表没有 payment_id

【问题讨论】:

    标签: mysql join union innodb


    【解决方案1】:

    在 IF 语句中使用 LEFT JOIN

    mysql> ( SELECT  u.user,IFNULL(ua.pid ,u.pid) as pid
                FROM  orders u
                inner JOIN  orders_addon ua on ua.poid=u.poid
                WHERE  u.payment_id = 'abc123'
           )
        union  all
          ( SELECT  u.user,u.pid
                from  orders u
                where  u.payment_id = 'def345'
          );
    +------+------+
    | user | pid  |
    +------+------+
    |    1 |    3 |
    |    1 |    5 |
    |    2 |    2 |
    +------+------+
    3 rows in set (0.00 sec)
    
    mysql> ( SELECT  u.user,IFNULL(ua.pid ,u.pid) as pid
                FROM  orders u
                inner JOIN  orders_addon ua on ua.poid=u.poid
                WHERE  u.payment_id = 'def345'
           )
        union  all
           ( SELECT  u.user,u.pid
                from  orders u
                where  u.payment_id = 'def345'
           );
    
    +------+------+
    | user | pid  |
    +------+------+
    |    2 |    2 |
    +------+------+
    1 row in set (0.00 sec)
    

    【讨论】:

    • 请试试这个并告诉我
    • 对于第一个示例,它只返回 2 行,orders 表的结果丢失。
    猜你喜欢
    • 1970-01-01
    • 2014-05-26
    • 2010-12-31
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 2016-08-04
    • 2014-03-23
    相关资源
    最近更新 更多