【问题标题】:How do I join multiple (four) tables using sql with conditions?如何使用带有条件的 sql 连接多个(四个)表?
【发布时间】:2020-03-13 10:00:17
【问题描述】:

我正在尝试创建一个有条件地从多个表中提取数据的 SQL 查询。

我有四张桌子:

订单

+------+------------+------------+
| id   | date_added | currency   |
+------+------------+------------+
|   1  | 2018-07-23 |          1 |
+------+------------+------------+

order_items

+------+------------+------------+---------------+---------------+
| id   | order_id   | price      | product_id    | product_type  |
+------+------------+------------+---------------+---------------+
|   1  | 1          | 100.00     |          1    |   ticket      |
+------+------------+------------+---------------+---------------+

订单数据

+------+--------------+---------------+
| id   | order_id     | ext_order_ref |
+------+--------------+---------------+
|   1  | 1            |         ABC   |
+------+--------------+---------------+

产品

+------+------------+------------+
| id   | date       | product_id |
+------+------------+------------+
|   1  | 2020-03-12 |          1 |
+------+------------+------------+
|   2  | 2020-03-18 |          2 |
+------+------------+------------+
|   3  | 2020-03-20 |          3 |
+------+------------+------------+

我需要输出满足以下条件的订单:

  • 一行中的每个订单都有总计(根据具有匹配订单 ID 的订单商品计算)
  • order_data 表中与该订单匹配的“ext_order_ref”
  • 仅包含具有特定产品类型的订单商品
  • 仅包含特定日期范围内产品的订单

首选输出如下所示:

+------------+------------+--------------+
| order_id   | total      | ext_order_ref|
+------------+------------+--------------+
|   1        | 100        |          ABC |
+------------+------------+--------------+

我目前的查询基本上是这样的;请指教

SELECT
orders.id as order_id,
SUM(order_items.price) as total,
order_data.ext_order_ref

FROM orders

INNER JOIN order_data
ON orders.id = order_data.ext_order_ref

RIGHT JOIN order_items
ON orders.id = order_items.order_id

LEFT JOIN products
ON order_items.product_id = products.product_id
WHERE order_items.product_type = 'ticket' AND products.date BETWEEN '2020-03-12' AND '2020-03-18'

GROUP BY orders.id

它几乎可以工作,但并不完全。特别是日期引起了问题。

提前致谢!

【问题讨论】:

  • 尝试在products.date BETWEEN '2020-03-12' AND '2020-03-18'周围加上括号
  • ext_order_id = 1?或ABC
  • 日期导致什么问题?这里没有问题陈述!!
  • 将其更新为 _ref 以便清楚它是外部提供的字符串,而不是主键
  • 在包含日期语句之前一切正常,返回零结果。我是 SQL 新手,所以即使这有效,我还是想在这里问一下,以防有更好的方法我还不知道;即使有积极的结果:这就是我问这个问题的原因。

标签: mysql sql


【解决方案1】:

首先确定查询的驱动表,并根据驱动表形成查询。 驱动表是其他表连接的一个主表。

More information on driving tables from askTom

在您的情况下,驱动表是 Orders 表。您正在RIGHT OUTER JOINLEFT OUTER JOIN 之间切换。这会导致结果集中的混乱。

我已修改查询。看看它是否有效。

SELECT
orders.id as order_id,
SUM(order_items.price) as total,
order_data.ext_order_id

FROM orders

INNER JOIN order_data
ON orders.id = order_data.ext_order_id

LEFT OUTER JOIN order_items
ON orders.id = order_items.order_id

LEFT OUTER JOIN products
ON order_items.product_id = products.product_id
WHERE order_items.product_type = 'ticket' AND products.date BETWEEN '2020-03-12' AND '2020-03-18'

GROUP BY orders.id

【讨论】:

    【解决方案2】:

    我完全不明白你为什么想要外部连接。如果我正确地遵循条件:

    SELECT o.id as order_id,
           SUM(oi.price) as total,
           od.ext_order_id
    FROM orders o INNER JOIN
         order_data od
         ON o.id = od.ext_order_id INNER JOIN
         order_items oi
         ON o.id = oi.order_id INNER JOIN
         products p
         ON oi.product_id = p.product_id
    WHERE oi.product_type = 'ticket' AND
          p.date >= '2020-03-12' AND 
          p.date < '2020-03-19'
    GROUP BY o.id, od.ext_order_id;
    

    注意表别名的使用,以便查询更易于编写和阅读。

    【讨论】:

      猜你喜欢
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-31
      • 1970-01-01
      • 2011-03-23
      • 2022-01-08
      • 1970-01-01
      相关资源
      最近更新 更多