【问题标题】:LEFT JOIN on multiple columns and conditions多列和条件的左连接
【发布时间】:2020-11-07 16:55:14
【问题描述】:

我有两张桌子,一张用于订单,一张用于产品

ORDERS TABLE 

+----------+-----------+--------+---------------------+----------+----------+---------------------+--------+
| order_id | order_by  | status | created_at          | product1 | product2 | delivery_date       | pickup |
+----------+-----------+--------+---------------------+----------+----------+---------------------+--------+
|        1 | Maria     |      0 | 2020-07-19 00:00:00 |        1 |        3 | 2020-07-17 00:00:00 |      0 |
|        2 | Joao      |      0 | 2020-07-20 00:00:00 |        2 |        0 | 2020-07-20 00:00:00 |      0 |
|        3 | Jose      |      1 | 2020-07-20 00:00:00 |        3 |        0 | 2020-07-20 00:00:00 |      0 |
|        4 | Matias    |      0 | 2020-07-19 23:50:40 |        1 |        3 | 2020-07-19 00:00:00 |      0 |
|        5 | Matias    |      0 | 2020-07-19 23:50:40 |        1 |        3 | 2020-07-19 00:00:00 |      0 |
|        6 | Joaozinho |      0 | 2020-07-19 00:00:00 |        1 |        3 | 2020-07-22 00:00:00 |      0 |
+----------+-----------+--------+---------------------+----------+----------+---------------------+--------+


PRODUCTS TABLE

+----+-----------+-------+
| id | name      | price |
+----+-----------+-------+
|  1 | Produto 1 |    11 |
|  2 | Produto 2 |    22 |
|  3 | Produto 3 |    33 |
|  4 | Produto 4 |    44 |
|  5 | Produto 5 |    55 |
+----+-----------+-------+


EXPECTED OUTPUT

+----------+-----------+--------+---------------------+----------+----------+---------------------+--------+-----------+----------+-----------+----------+
| order_id | order_by  | status | created_at          | product1 | product2 | delivery_date       | pickup | p1_name   | p1_price | p2_name   | p2_price |
+----------+-----------+--------+---------------------+----------+----------+---------------------+--------+-----------+----------+-----------+----------+
|        1 | Maria     |      0 | 2020-07-19 00:00:00 |        1 |        3 | 2020-07-17 00:00:00 |      0 | Produto 1 |       11 | Produto 3 |      33  |
|        2 | Joao      |      0 | 2020-07-20 00:00:00 |        2 |        0 | 2020-07-20 00:00:00 |      0 | Produto 2 |       22 |   null    |     null |
|        3 | Jose      |      1 | 2020-07-20 00:00:00 |        3 |        0 | 2020-07-20 00:00:00 |      0 | Produto 3 |       33 |   null    |     null |
|        4 | Matias    |      0 | 2020-07-19 23:50:40 |        1 |        3 | 2020-07-19 00:00:00 |      0 | Produto 1 |       11 | Produto 3 |       33 |
|        5 | Matias    |      0 | 2020-07-19 23:50:40 |        1 |        3 | 2020-07-19 00:00:00 |      0 | Produto 1 |       11 | Produto 3 |       33 |
|        6 | Joaozinho |      0 | 2020-07-19 00:00:00 |        1 |        3 | 2020-07-22 00:00:00 |      0 | Produto 1 |       11 | Produto 3 |       22 |
+----------+-----------+--------+---------------------+----------+----------+---------------------+--------+------+-----------+-------+------------------+

我需要对订单表中的每个产品(product1、product2..)和具有不同名称(product1_name、product2_name..)的价格列进行 LEFT JOIN

【问题讨论】:

  • 以表格形式提供您的样本数据和预期输出。您使用的是哪个 SQL 引擎,因为您已经标记了多个。
  • 请同时采样数据。
  • 更新了样本数据。我正在使用 MySQL。
  • 预期输出?

标签: mysql sql database join mysql-workbench


【解决方案1】:
select o.*, p1.name, p1.price
from orders o
inner join products p1 on p1.id=o.product1

添加 product2 应该不会那么难,留作练习吧...

【讨论】:

  • 我需要将列名更改为 productX_name 和 productX_price
  • 您可以通过在文档中搜索“别名”来了解如何做到这一点
【解决方案2】:

你需要两个joins 和products 表:

select
    o.*,
    p1.name  p1_name,
    p1.price p1_price,
    p2.name  p2_name,
    p2.price p2_price
from orders o
left join products p1 on p1.id = o.product1
left join products p2 on p2.id = o.product2

如果product1 始终可用,您可以将第一个left join 转换为inner join,这会使查询的效率略微提高。

【讨论】:

    猜你喜欢
    • 2011-12-11
    • 1970-01-01
    • 2015-02-14
    • 2013-11-09
    • 2018-12-06
    • 2010-11-11
    • 2016-03-17
    • 2019-07-18
    • 1970-01-01
    相关资源
    最近更新 更多