mysql - 在mysql中加入5个表,在同一个查询中显示两个不同表的两个SUM列
问题描述
我正在一个项目中工作,以控制用于不同任务的物品库存。每个任务都有一个或多个仓库,每个仓库接收完成任务所需的物品的输入,最后用于任务的真实物品数量在used_items表中。
表格
task:
taskId | name
-----------------
warehouse:
warehous_id | taskId
----------------------
inputs:
itemId | qty | warehouse_id
--------------------------------
items:
itemId | itemName
--------------------
used:
itemId | qty | taskId
-----------------------------
我正在尝试使用以下查询获取特定任务项目的报告:
QUERY1:在特定任务中使用的项目(例如任务 1):
SELECT t.taskId
, it.itemId
, it.itemName
, SUM(u.qty) total_used
FROM items it
, task t
, used u
WHERE it.itemId = u.itemId
AND t.taskId = u.taskId
AND t.taskId = 1
GROUP
BY it.itemId
此查询给出以下结果:
taskId itemId itemName total_used
1 2 item2 10
1 3 item3 1
1 4 item4 6
1 5 item5 6
1 6 item6 2
1 8 item8 9
1 9 item9 4
1 10 item10 7
这个结果是正确的。使用了 8 个项目。
QUERY2:为特定任务输入项目(例如任务 1):
SELECT t.taskId
, it.itemId
, it.itemName
, SUM(ip.qty) total_input
FROM items it
, task t
, inputs ip
, warehouse w
WHERE it.itemId=ip.itemId
AND t.taskId=w.taskId
AND w.warehouseId=ip.warehouseId
AND t.taskId=1
GROUP
BY it.itemId
此查询给出以下结果:
taskId itemId itemName total_input
1 1 item1 24
1 2 item2 26
1 3 item3 21
1 4 item4 18
1 5 item5 22
1 6 item6 3
1 7 item7 17
1 8 item8 12
1 9 item9 17
1 10 item10 20
这个结果是正确的。10 个输入项。
这两个查询都会生成正确的结果。但是当我尝试将两个查询结合起来以显示两列以及每一列的 SUM 时,问题就来了,结果不好。
组合查询:
SELECT t.taskId
, it.itemId
, it.itemName
, SUM(ip.qty) total_input
, SUM(u.qty) total_used
FROM items it
, task t
, inputs ip
, warehouse w
, used u
WHERE it.itemId=ip.itemId
AND t.taskId=w.taskId
AND w.warehouseId=ip.warehouseId
AND u.itemId=it.itemId
AND u.taskId=t.taskId
AND t.taskId=1
GROUP
BY it.itemId
结果:
taskId itemId itemName total_input total_used
1 2 item2 52 90
1 3 item3 21 7
1 4 item4 18 24
1 5 item5 22 30
1 6 item6 3 4
1 8 item8 12 27
1 9 item9 17 20
1 10 item10 20 35
这会产生错误的结果,首先是因为它只显示 8 列而不是 10 列,而且总数也是错误的。我已经搜索并尝试了很多关于如何正确执行此操作的方法,但我只找到了两个表的子查询示例或左连接,这更简单,但是当它带有 5 个涉及所有关系的表时,我不知道该怎么做。
我很感激你能给我的任何帮助。
解决方案
首先,我将使用 JOIN 转换查询 1 和查询 2,这使其更具可读性。
示例(参见http://www.sql-join.com/):
select order_date, order_amount
from customers
join orders on customers.customer_id = orders.customer_id
然后为 Query1 和 Query2 创建一个视图:
CREATE VIEW `myView1` AS
select order_date, order_amount
from customers
join orders on customers.customer_id = orders.customer_id
然后你可以做一个新的查询加入两个视图。
祝你好运 :)
推荐阅读
- python - 未找到 Mongod.service => 从空双端队列弹出 => 身份验证失败
- spring - 如何使用 RestTemplate 传递标头值?
- cookies - 为什么浏览器对我的表单显示不同的 CSRF 值
- mysql - 自动增量不是从多列主键的定义值开始
- amazon-lex - Amazon connect - 使用 Lex 机器人和 DTMF 获取客户输入块 - 处理用户输入重试
- python - 在 JSON 中分别选择对应字符串的记录
- javascript - 从反应自定义钩子返回 3 个数组
- javascript - S3 listObjects递归节点
- python - 如何切割连接到低于pyvista中某个值的点的顶点和面?
- python - 如何使用 Scrapy 框架解析文本中的 href 属性?应该写入哪个 xpath 值来捕获它?