Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.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_Union_Foreign Key Relationship - Fatal编程技术网

用于组合共享第三个表外键的两个表的数据的MYSQL查询

用于组合共享第三个表外键的两个表的数据的MYSQL查询,mysql,union,foreign-key-relationship,Mysql,Union,Foreign Key Relationship,我试图将两个表sales&purchase中的数据合并到一个表中。Sales&Purchase表都共享来自第三个表存储的外键 构造查询以获得与结果表完全相同的结果的最佳方法是什么,最好(如果可能)不使用子查询,因为我需要创建查询结果的视图,而MYSQL不允许使用子查询创建查询视图 我尝试了使用union选择,但没有得到预期的结果 以下查询(未测试)应给出所需的结果集: SELECT store_name AS store, MONTH(sales.date) AS month, SUM(sale

我试图将两个表sales&purchase中的数据合并到一个表中。Sales&Purchase表都共享来自第三个表存储的外键

构造查询以获得与结果表完全相同的结果的最佳方法是什么,最好(如果可能)不使用子查询,因为我需要创建查询结果的视图,而MYSQL不允许使用子查询创建查询视图

我尝试了使用union选择,但没有得到预期的结果

以下查询(未测试)应给出所需的结果集:

SELECT store_name AS store, MONTH(sales.date) AS month, SUM(sales.sales) AS sales, SUM(purchase.purchase) AS purchase
FROM store 
JOIN sales ON store.store_id = sales.store_id
JOIN purchase ON store.store_id = purchase.store_id
GROUP BY store.store_id,MONTH(sales.date), MONTH(purchase.date)

我认为不使用子查询就不可能得到预期的结果,因为您需要按月分组并从两个不同的表中存储数据,每个组中都可能有许多行,并且在分组之前将它们连接在一起会成倍增加行。更重要的是,您需要对这些结果进行完全的外部联接,而mysql不支持这种联接,您必须通过两个相反的左联接的并集来模拟它。因此,基本上,对于这个表模式,您必须使用一个非常复杂的查询,它看起来更像是一个学术问题,而不是现实生活中的示例

( SELECT st.store_name, s.month,
          COALESCE( s.salestotal, 0 ) as salestotal, 
          COALESCE( p.purchasetotal, 0 ) as purchasetotal
FROM 
  store st
  JOIN
    ( SELECT store_id, SUM(sales) as salestotal, 
             DATE_FORMAT( date, '%b %Y' ) as month
      FROM sales
      GROUP BY store_id, month ) s
  ON st.store_id = s.store_id
  LEFT JOIN
    ( SELECT store_id, SUM(purchase) as purchasetotal, 
      DATE_FORMAT( date, '%b %Y' ) as month
      FROM purchase
      GROUP BY store_id, month ) p
  ON p.store_id = s.store_id AND p.month = s.month )
UNION
( SELECT st.store_name, p.month,
          COALESCE( s.salestotal, 0 ) as salestotal, 
          COALESCE( p.purchasetotal, 0 ) as purchasetotal
FROM
  store st
JOIN
  ( SELECT store_id, SUM(purchase) as purchasetotal, 
           DATE_FORMAT( date, '%b %Y' ) as month
    FROM purchase
    GROUP BY store_id, month ) p
ON st.store_id = p.store_id
LEFT JOIN 
  ( SELECT store_id, SUM(sales) as salestotal, 
    DATE_FORMAT( date, '%b %Y' ) as month
    FROM sales
    GROUP BY store_id, month ) s
ON
  p.store_id = s.store_id AND p.month = s.month )
ORDER BY month, store_name

这个查询对我不起作用。顺便说一句,有没有其他方法,比如从这些现有的表中创建一个新表来获得结果?请更具体地说明它是如何不适合您的。如果您看到任何错误消息,请在此处写入该消息,如果它给出的结果与您预期的后示例数据和您应该得到的结果不同,等等。还要确保复制完整的查询,因为它不适合窗口,您必须向下滚动才能看到所有查询。