mysql - 基于多个 JOINS 创建输出
问题描述
我们正面临一个我们无法开始工作的问题,也许我们对困难的 MySQL 查询了解不足。我们用 INNER/OUTER/LEFT/RIGHT JOIN 尝试了几件事。
我们的目标是创建一个 .csv 文件作为所有订单的报告,包括他们的商品。订单(存储在 table 中order
)与多个表(如组织、客户等)有关系。其中,3 个应该加入我们的结果中:
order_item
order_upsell
order_addition
我们有一个 ID #196 的订单,这 3 个表中共有 6 个相关行:
order_item
相关的4 行order.id
>order_item.order_id
- 1 行
order_upsell
相关order.id
>order_upsell.order_id
- 1 行
order_addition
相关order.id
>order_addition.order_id
我们的预期输出是 6 行,我们需要它来加入一列tax_id
来计算定价。但是当我们执行下面的查询时,只返回了 4 行。我们认为发生这种情况是因为order_item
.
我们应该得到的结果需要以下列:
- ORDER_ID |
order.id
- 订单日期 |
order.created
- ORDER_AMOUNT |
order.amount
该值是 和 中所有项目的order_item
组合。order_upsell
order_addition
- ORDER_TAX | 这应该用总和(所有值一起)来计算。像上面的值一样有 6 个相关的行。为了计算这个数量,应该从 table 中检索每行的百分比(无论是在 table
order_item
中order_upsell
还是在 中) 。order_addition
tax
- 产品 |
product.name
应该从表中检索product
,基于order_item
. 请注意,每个订单的所有 product_id 始终相同。这意味着,order_item
所有产品都具有相同的相关产品。 - CUSTOMER_FIRSTNAME |
customer.firstname
- 客户姓氏 |
customer.lastname
- 客户电子邮件 |
customer.email
根据下表数据,这应该是输出:
ORDER_ID | 订购日期 | 订单金额 | ORDER_TAX | 产品 | CUSTOMER_FIRSTNAME | CUSTOMER_LASTNAME | CUSTOMER_EMAIL |
---|---|---|---|---|---|---|---|
1 | 2021-01-01 00:00:00 | 12.50 | 1.94 | 示例产品 | 霍尔迪 | 范图伊 | jordi@example.com |
税收将以这种方式计算,也基于以下数据:
排 | 价格 | 税率 | 税额 |
---|---|---|---|
ID 1来自order_item |
7.50 | 21% | 7.50 - (7.50 / 1.21) = 1.30165 |
ID 2来自order_item |
2.50 | 9% | 2.50 - (2.50 / 1.09) = 0.20642 |
ID 1来自order_upsell |
1.00 | 21% | 1.00 - (1.00 / 1.21) = 0.17355 |
ID 1来自order_addition |
1.50 | 21% | 1.50 - (1.50 / 1.21) = 0.26033 |
所有行中字段ORDER_AMOUNT
的总价值为“12.50”,与 value 匹配order.amount
。
字段ORDER_TAX
的总值是上面 4 行的总和,即“1.94”(四舍五入到小数点后两位)。哪个匹配 value order.tax
。
SELECT *
FROM `order` o
LEFT JOIN `order_item` oi ON (oi.order_id = o.id)
LEFT JOIN `order_upsell` ou ON (ou.order_id = o.id)
LEFT JOIN `order_addition` oa ON (oa.order_id = o.id);
MySQL 表:
我删除了与此问题无关的列以保持内容清晰。
桌子:order
ID | 客户ID | 数量 | 税 | 创建 |
---|---|---|---|---|
1 | 1 | 12.50 | 1.94 | 2021-01-01 00:00:00 |
桌子:order_item
ID | order_id | product_id | tax_id | 数量 |
---|---|---|---|---|
1 | 1 | 1 | 1 | 7.50 |
2 | 1 | 1 | 2 | 2.50 |
桌子:order_upsell
ID | order_id | upsell_id | tax_id | 数量 |
---|---|---|---|---|
1 | 1 | 1 | 1 | 1.00 |
桌子:order_addition
ID | order_id | add_id | tax_id | 数量 |
---|---|---|---|---|
1 | 1 | 1 | 1 | 1.50 |
桌子:customer
ID | 名 | 姓 | 电子邮件 |
---|---|---|---|
1 | 霍尔迪 | 范图伊 | jordi@example.com |
桌子:tax
ID | 姓名 | 百分比 |
---|---|---|
1 | 高税 | 21 |
2 | 低税 | 9 |
桌子:product
ID | 姓名 |
---|---|
1 | 示例产品 |
所有帮助将不胜感激:-)
解决方案
推荐阅读
- firebase - 为什么我通过 Firebase Functions 调用的 Firestore 事务超时?
- arrays - 将数组更改为整数百分比值
- c++ - 如何相对于观察方向在地形中移动
- nuget-package - SharePoint 项目解决方案中缺少 SharePointContext.cs 和 TokenHelper.cs 文件
- c++ - 为什么在使用点积的结果时 acos() 会导致“nan(ind)”?
- c++ - std::notify_all_at_thread_exit 是如何工作的?
- c - printf 打印不稳定
- javascript - 获取随机 Discord 用户
- swift - 防止 GKGridGraph 在寻路时崩溃
- button - BackgroundImage Javafx 组合框