Соедините 5 таблиц в mysql, чтобы отобразить два столбца SUM из двух разных таблиц в одном запросе - PullRequest
0 голосов
/ 30 марта 2020

Я работаю в проекте, чтобы контролировать запас товаров, которые используются в различных задачах. Каждая задача имеет один или несколько складов, каждый склад получает входные данные, необходимые для выполнения задачи, и, наконец, реальные qtys, используемые для задачи, находятся в таблице used_items.

TABLES

task:
taskId  | name 
-----------------

warehouse: 
warehous_id  | taskId
----------------------

inputs:
itemId |  qty  |  warehouse_id
--------------------------------


items:
itemId  | itemName
--------------------


used:
itemId |  qty   |  taskId
-----------------------------

Я пытаюсь получить отчет для элементов определенной задачи, используя следующие запросы:

QUERY1: элементы, используемые в отдельной задаче c (например, задача 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: ввод элементов для отдельной задачи c (например, задача 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 элементов ввода.

оба запроса дают правильные результаты. Но проблема возникает, когда я пытаюсь объединить оба запроса, чтобы показать два столбца с суммой каждого из них, результат не в порядке.

Объединенный запрос:

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 таблиц со всеми связанными отношениями, я не знаю, как это сделать.

Я ценю любую помощь, которую вы можете мне дать.

1 Ответ

0 голосов
/ 30 марта 2020

Сначала я трансформирую Query 1 и Query 2, используя JOIN, это делает его более читабельным.

Пример (см. 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

Затем вы можете выполнить новый запрос, объединяющий оба представления.

Удачи:)

...