Php 插入。。从多个表中选择多行

Php 插入。。从多个表中选择多行,php,mysql,sql,Php,Mysql,Sql,我需要记录每天针对每个项目请求和发布的项目数量。采购单表为: requested\u items表包含请求的项目,如下所示: 移动表包含以下请求的项目: 需要的输出(要插入的数据)是: 一种方法是从前两个查询中获取发出和请求的项目,然后根据每个项目id构建发出和请求的项目数组,然后在每日移动表中插入这些值,如下所示: SELECT n.item_id AS n__item_id, SUM(n.qty) AS qty FROM requested_items n LEFT JOIN pur

我需要记录每天针对每个项目请求和发布的项目数量。
采购单
表为:

requested\u items
表包含请求的项目,如下所示:

移动
表包含以下请求的项目:

需要的输出(要插入的数据)是:

一种方法是从前两个查询中获取发出和请求的项目,然后根据每个项目id构建发出和请求的项目数组,然后在每日移动表中插入这些值,如下所示:

SELECT n.item_id AS n__item_id, SUM(n.qty) AS qty
FROM requested_items n LEFT JOIN purchase_doc doc ON n.doc_id = doc.id 
WHERE (doc.type = 'Item Request' AND doc.created_at > DATE_SUB(NOW(), INTERVAL 24 HOUR)) 
GROUP BY n.item_id

SELECT n.item_id AS item_id, SUM(n.qty) AS qty
FROM movement n LEFT JOIN purchase_doc doc ON n.doc_id = doc.id 
WHERE (doc.type = 'Store Issue' AND doc.created_at > DATE_SUB(NOW(), INTERVAL 24 HOUR)) 
GROUP BY n.item_id
从这些和其他选择中,我需要每天为每个项目插入一行,其中包含此项目的请求、问题等数量,如下所示:

INSERT INTO daily_movement date, item_id, requested_qty, issued_qty VALUES ( NOW(), 23, 4, 5), ( NOW(), 25, 5, 5), ( NOW(), 113, 6, 8);
但是会有太多的选择(因为我还需要为每个项目执行其他活动),然后是插入


我的问题是:是否可以通过一个单一的选择。。。插入语句。如果没有,有人能推荐一种更优雅的方法吗?您可以使用union运算符,或者在一次选择中获得所有结果。您可以使用如下查询-

编辑:


我是这么想的,但可能过于简化了:

INSERT INTO `daily_movement`
  (`date`, `item_id`, `requested_qty`, `issued_qty`)
SELECT NOW(), `r`.`item_id`, SUM(`r`.`qty`), SUM(`m`.`qty`)
  FROM `purchase_doc` `d`
  JOIN `requested_items` `r`
    ON `r`.`doc_id` = `d`.`id`
  LEFT JOIN `movement` `m`
    ON `m`.`doc_id` = `d`.`id`
WHERE
    (`d`.`type` = 'Item Request' OR `d`.`type` = 'Store Issue')
  AND
    `d`.`created_at` > DATE_SUB(NOW(), INTERVAL 24 HOUR)
GROUP BY `r`.`item_id`
编辑

这是我的最终答案,通过一个讨厌的
联盟来解决MySQL缺少
完全外部连接的问题:

INSERT INTO `daily_movement`
  (`date`, `item_id`, `week_no`, `requested_qty`, `issued_qty`)
SELECT *
FROM (
  (
    SELECT COALESCE(`r`.`item_id`, `a`.`item_id`) AS `item_id`, CURDATE() AS `date`, NULL AS `week_no`, SUM(`r`.`qty`) AS `requests`, COALESCE(`a`.`issued`, 0) AS `issued`
    FROM `purchase_doc` `d`
    LEFT JOIN `requested_items` `r`
      ON `r`.`doc_id` = `d`.`id` 
    LEFT JOIN (
      SELECT `m`.`item_id`, SUM(`m`.`qty`) AS `issued`
      FROM `purchase_doc` `d`
      JOIN `movement` `m`
        ON `m`.`doc_id` = `d`.`id` 
      WHERE `d`.`type` = 'Store Issue'
        AND `d`.`created_at` > DATE_SUB(NOW(), INTERVAL 24 HOUR)
      GROUP BY `m`.`item_id`
    ) `a`
      ON `a`.`item_id` = `r`.`item_id`
    WHERE `d`.`type` = 'Material Requisition'
      AND `d`.`created_at` > DATE_SUB(NOW(), INTERVAL 24 HOUR)
    GROUP BY `r`.`item_id`
  ) UNION DISTINCT (
    SELECT COALESCE(`m`.`item_id`, `a`.`item_id`) AS `item_id`, CURDATE() AS `date`, NULL AS `week_no`, COALESCE(`a`.`requests`, 0) AS `requests`, SUM(`m`.`qty`) AS `issued`
    FROM `purchase_doc` `d`
    LEFT JOIN `movement` `m`
      ON `m`.`doc_id` = `d`.`id` 
    LEFT JOIN (
      SELECT `r`.`item_id`, SUM(`r`.`qty`) AS `requests`
      FROM `purchase_doc` `d`
      JOIN `requested_items` `r`
        ON `r`.`doc_id` = `d`.`id` 
      WHERE `d`.`type` = 'Material Requisition'
        AND `d`.`created_at` > DATE_SUB(NOW(), INTERVAL 24 HOUR)
      GROUP BY `r`.`item_id`
    ) `a`
      ON `a`.`item_id` = `m`.`item_id`
    WHERE `d`.`type` = 'Store Issue'
      AND `d`.`created_at` > DATE_SUB(NOW(), INTERVAL 24 HOUR)
    GROUP BY `m`.`item_id`
  )
  ORDER BY `item_id`
) `u`

能否显示在前两个
选择中检索的字段与
插入中的字段之间的关系?UNION对
插入没有帮助。。。选择
。您需要
加入
行,而不是获取更多行。您没有包括
移动
表anywhere@DaveRandom好的,我查一下,不行。没有插入任何内容。select语句本身(不包括INSERT)给出的输出不正确。这样,我只能从
请求的\u项
移动
表中提取值。另一个表中的数量将被聚合。SELECT和GROUP BY子句中的
r
item\u id
正在创建问题+1,因为它非常接近我想要的。如果
请求的\u项
移动
是一个单独的表,它就可以工作了。请查看是否可以更正此查询以获得所需的result@qais对不起,我不太明白你的问题是什么。您能否显示这三个表中的一些示例数据,以及当前的结果和您想要的结果?@qais OK,请尝试。根据上面的数据,它当然会产生你想要的结果集,但我不确定它是否适用于所有情况——老实说,我已经盯着它看了很久,胡乱琢磨了很久,我再也不能正确地想象它了。我可能会在早上把它捡起来重新检查。很明显,这是一个SELECT,它演示了将要检索的结果集。对于实际执行的查询,您可以轻松地将
INSERT添加到它上面的
。@qa没问题,我今天早上醒来后立即意识到我不喜欢这一点。这里真正需要的是外部查询和内部查询的派生表之间的
完全外部联接。实际上,任何在内部查询中产生非空结果但与外部查询不匹配的
项id
s(即,发出的
项id为非零值,请求的
项id为零值)都不会出现在结果中。不幸的是(也是荒谬的)MySQL不支持完全联接,您必须将左联接与右外部联接合并,这使得这种方式的效率大大降低。
INSERT INTO `daily_movement`
  (`date`, `item_id`, `week_no`, `requested_qty`, `issued_qty`)
SELECT *
FROM (
  (
    SELECT COALESCE(`r`.`item_id`, `a`.`item_id`) AS `item_id`, CURDATE() AS `date`, NULL AS `week_no`, SUM(`r`.`qty`) AS `requests`, COALESCE(`a`.`issued`, 0) AS `issued`
    FROM `purchase_doc` `d`
    LEFT JOIN `requested_items` `r`
      ON `r`.`doc_id` = `d`.`id` 
    LEFT JOIN (
      SELECT `m`.`item_id`, SUM(`m`.`qty`) AS `issued`
      FROM `purchase_doc` `d`
      JOIN `movement` `m`
        ON `m`.`doc_id` = `d`.`id` 
      WHERE `d`.`type` = 'Store Issue'
        AND `d`.`created_at` > DATE_SUB(NOW(), INTERVAL 24 HOUR)
      GROUP BY `m`.`item_id`
    ) `a`
      ON `a`.`item_id` = `r`.`item_id`
    WHERE `d`.`type` = 'Material Requisition'
      AND `d`.`created_at` > DATE_SUB(NOW(), INTERVAL 24 HOUR)
    GROUP BY `r`.`item_id`
  ) UNION DISTINCT (
    SELECT COALESCE(`m`.`item_id`, `a`.`item_id`) AS `item_id`, CURDATE() AS `date`, NULL AS `week_no`, COALESCE(`a`.`requests`, 0) AS `requests`, SUM(`m`.`qty`) AS `issued`
    FROM `purchase_doc` `d`
    LEFT JOIN `movement` `m`
      ON `m`.`doc_id` = `d`.`id` 
    LEFT JOIN (
      SELECT `r`.`item_id`, SUM(`r`.`qty`) AS `requests`
      FROM `purchase_doc` `d`
      JOIN `requested_items` `r`
        ON `r`.`doc_id` = `d`.`id` 
      WHERE `d`.`type` = 'Material Requisition'
        AND `d`.`created_at` > DATE_SUB(NOW(), INTERVAL 24 HOUR)
      GROUP BY `r`.`item_id`
    ) `a`
      ON `a`.`item_id` = `m`.`item_id`
    WHERE `d`.`type` = 'Store Issue'
      AND `d`.`created_at` > DATE_SUB(NOW(), INTERVAL 24 HOUR)
    GROUP BY `m`.`item_id`
  )
  ORDER BY `item_id`
) `u`