mysql - 如何使用带有条件的 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 |
+------+------------+------------+
我需要输出具有以下条件的订单:
- 一行中的每个订单都有总计(从具有匹配订单 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
它几乎可以工作,但并不完全。日期尤其是引起问题。
提前致谢!
解决方案
我不明白为什么你会想要外部连接。如果我正确遵循条件:
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;
请注意表别名的使用,以便查询更易于编写和阅读。
推荐阅读
- hadoop - 将小文件存储在 hdfs 中并在 Nifi Flow 中存档
- image - Google Play 屏幕截图和图像像素化/模糊
- string - 展开跳过的 Chars 迭代器
- excel - 在活动工作簿目录中从 PDF 转换为 Word
- c# - 根据多选列表从数据库中查询所有匹配的值
- c# - C# 接口无法实例化,为什么我可以在不指定具体类型的情况下使用 IEnumerable
- javascript - 如何在角度组件中定义完整选项卡?
- julia - 在虚拟环境中从终端运行 Julia 脚本
- json - 如何使用带有复杂 JSON 树的颤振从实时数据库 firebase 读取数据
- flutter - 嗨,有人可以向我解释为什么我必须在 MyApp() 中创建一个构建器,以便我可以使用 mediaquery 吗?