Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 查询以从四个表中获取数据_Mysql - Fatal编程技术网

Mysql 查询以从四个表中获取数据

Mysql 查询以从四个表中获取数据,mysql,Mysql,我有以下计划, 采购订单 +-------------------+----------------------+ | purchase_order_id | purchase_order | +-------------------+----------------------+ | 54 | Purchase Order 12345 | | 56 | po-laptop-hp-3 | |

我有以下计划, 采购订单

+-------------------+----------------------+
| purchase_order_id | purchase_order       |
+-------------------+----------------------+
|                54 | Purchase Order 12345 |
|                56 | po-laptop-hp-3       |
|                57 | po-laptop-hp-1       |
+-------------------+----------------------+
+-------------------+--------------------------+-------------------+
| delivery_order_id | purchase_order_detail_id | recieved_quantity |
+-------------------+--------------------------+-------------------+
|                62 |                       61 |               250 |
|                63 |                       62 |               300 |
|                64 |                       63 |                34 |
|                65 |                       64 |                34 |
|                66 |                       65 |                34 |
|                67 |                       66 |                34 |
|                68 |                       61 |                34 |
|                69 |                       61 |                34 |
+-------------------+--------------------------+-------------------+
采购订单详细信息

+--------------------------+-------------------+---------+------------------+
| purchase_order_detail_id | purchase_order_id | item_id | ordered_quantity |
+--------------------------+-------------------+---------+------------------+
|                       61 |                54 |     279 |              500 |
|                       62 |                54 |     286 |              700 |
|                       63 |                56 |     279 |               43 |
|                       64 |                57 |     279 |               43 |
|                       65 |                57 |     286 |               43 |
|                       66 |                57 |     287 |               43 |
+--------------------------+-------------------+---------+------------------+
交货单

+-------------------+----------------------+
| purchase_order_id | purchase_order       |
+-------------------+----------------------+
|                54 | Purchase Order 12345 |
|                56 | po-laptop-hp-3       |
|                57 | po-laptop-hp-1       |
+-------------------+----------------------+
+-------------------+--------------------------+-------------------+
| delivery_order_id | purchase_order_detail_id | recieved_quantity |
+-------------------+--------------------------+-------------------+
|                62 |                       61 |               250 |
|                63 |                       62 |               300 |
|                64 |                       63 |                34 |
|                65 |                       64 |                34 |
|                66 |                       65 |                34 |
|                67 |                       66 |                34 |
|                68 |                       61 |                34 |
|                69 |                       61 |                34 |
+-------------------+--------------------------+-------------------+
股票

+----------+-------------------+------------+----------+------------------+---------------+
| stock_id | delivery_order_id | project_id | quantity | initial_quantity | stock_type_id |
+----------+-------------------+------------+----------+------------------+---------------+
|       12 |                62 |          1 |       60 |               60 |             1 |
|       13 |                63 |          1 |      120 |              120 |             1 |
|       14 |                63 |          1 |       50 |               50 |             1 |
|       15 |                64 |          1 |       12 |               12 |             1 |
|       16 |                62 |          1 |      120 |              120 |             1 |
|       17 |                62 |          1 |       12 |               12 |             1 |
+----------+-------------------+------------+----------+------------------+---------------+
我已经编写了这个查询,但它返回重复的结果

      SELECT po.created_on
           , po.purchase_order
           , i.item_name
           , u.unit_name
           , pod.ordered_quantity
           , do.recieved_quantity
           , do.recieved_on
           , po.remarks
        FROM purchase_order        po
           , purchase_order_detail pod
           , delivery_order        do
           , stock                 s
           , item                  i
           , unit                  u
       WHERE u.unit_id                    = i.unit_id 
         AND i.item_id                    = pod.item_id
         AND po.purchase_order_id         = pod.purchase_order_id
         AND pod.purchase_order_detail_id = do.purchase_order_detail_id  
         AND do.delivery_order_id         = s.delivery_order_id
         AND s.project_id                 = 1 
    ORDER BY po.purchase_order_id
           , pod.item_id
           ;
结果

+---------------------+----------------------+------------+-----------+------------------+-------------------+---------------------+---------------------------------------+
| created_on          | purchase_order       | item_name  | unit_name | ordered_quantity | recieved_quantity | recieved_on         | remarks                               |
+---------------------+----------------------+------------+-----------+------------------+-------------------+---------------------+---------------------------------------+
| 2015-02-24 22:48:15 | Purchase Order 12345 | HP Laptops | Unit      |              500 |               250 | 2015-02-21 00:00:00 | Adding first Purchase Order as a Test |
| 2015-02-24 22:48:15 | Purchase Order 12345 | HP Laptops | Unit      |              500 |               250 | 2015-02-21 00:00:00 | Adding first Purchase Order as a Test |
| 2015-02-24 22:48:15 | Purchase Order 12345 | Lenovo     | Unit      |              700 |               300 | 2015-02-21 00:00:00 | Adding first Purchase Order as a Test |
| 2015-02-24 22:48:15 | Purchase Order 12345 | Lenovo     | Unit      |              700 |               300 | 2015-02-21 00:00:00 | Adding first Purchase Order as a Test |
| 2015-02-24 22:55:40 | po-laptop-hp-3       | HP Laptops | Unit      |               43 |                34 | 2015-02-21 00:00:00 | dfgsdfgsd                             |
+---------------------+----------------------+------------+-----------+------------------+-------------------+---------------------+---------------------------------------+
关系是从上到下的一对多。 我想要得到的是每个采购订单、每个项目的订购数量、总接收数量以及库存数量,其中project_id=1 from stock

我期待着这样的事情

+-------------------+---------+------------------+---------------+----------+
| purchase_order_id | item_id | ordered_quantity | totalReceived | quantity |
+-------------------+---------+------------------+---------------+----------+
|                54 |     279 |              500 |           314 |      192 |
|                54 |     286 |              700 |           300 |      170 |
|                56 |     279 |               43 |            34 |       12 |
+-------------------+---------+------------------+---------------+----------+

尝试修改查询以使用不同的外部联接,而不是笛卡尔(“逗号”)联接

编辑

谢谢你澄清了我第一部分的错误。我现在意识到我们不能在一个查询中完成所有的计算(因为我们在不同的部分中对不同的列进行分组),所以我开始编写单独的子查询并将它们连接在一起。步骤如下:

  • 获取每个项目的已接收总已接收数量之和 交货订单表中的采购订单详细信息id
  • 将该子查询与delivery_order表本身连接起来,以获取各种delivery_order_id值的totalReceived
  • 将该结果集与purchase\u order\u detail表联接,以获取每个交货订单id的purchase\u order\u id、item\u id和ordered\u数量
我们现在有了一个结果集,包括交货订单id、采购订单id、物料id、订单数量和总接收量。最后两件事是:

  • 从库存表中获取每个交货订单id的数量总和()
  • 在order_id匹配(因此我们只获得一行)和project_id为1(因此我们只获得必要的delivery_order_id值)的条件下,将其与上述结果集连接起来。我将该条件放在sum子查询的
    WHERE
    子句中
以下是您的最终查询:

SELECT tmp1.purchase_order_id, tmp1.item_id, tmp1.ordered_quantity, tmp1.totalReceived, tmp2.quantity
FROM(
  SELECT tmp.delivery_order_id, pod.purchase_order_id, pod.item_id, pod.ordered_quantity, tmp.totalReceived
  FROM purchase_order_detail pod
  JOIN(
    SELECT do.delivery_order_id, tmp.purchase_order_detail_id, tmp.totalReceived
    FROM delivery_order do
    JOIN(
      SELECT do.purchase_order_detail_id, SUM(do.received_quantity) AS totalReceived
      FROM delivery_order do
      GROUP BY do.purchase_order_detail_id) tmp ON tmp.purchase_order_detail_id = do.purchase_order_detail_id) 
    tmp ON tmp.purchase_order_detail_id = pod.purchase_order_detail_id) tmp1
JOIN(
  SELECT s.delivery_order_id, SUM(quantity) AS quantity
  FROM stock s
  WHERE s.project_id = 1
  GROUP BY s.delivery_order_id) tmp2 ON tmp2.delivery_order_id = tmp1.delivery_order_id;

这是你的电话号码。如果您想了解结果是如何分别组合在一起的,它还显示了所有中间步骤。

您对样本数据的预期结果是什么?您的查询非常接近,但它返回了rowing结果,运行此命令可以查看订购数量和接收数量的差异。嗯,我将尝试解决它。你能用我应该得到的正确结果编辑你的问题吗?你的查询的问题是,当他们的多个已收数量与一个已订购数量相比时,它返回的结果不正确,否则是正确的。我的问题也发生了同样的情况。@MTaqi我为误解感到抱歉。我已经修改了这个问题,并用一个有效的解决方案替换了我的答案。@MTaqi您有机会测试编辑过的解决方案吗?有什么问题吗?