首页 > 解决方案 > 如何使用带有条件的 sql 连接多个(四个)表?

问题描述

我正在尝试创建一个有条件地从多个表中提取数据的 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 |
+------+------------+------------+

我需要输出具有以下条件的订单:

首选输出如下所示:

+------------+------------+--------------+
| 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

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

提前致谢!

标签: mysqlsql

解决方案


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

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;

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


推荐阅读