用于组合共享第三个表外键的两个表的数据的MYSQL查询
我试图将两个表sales&purchase中的数据合并到一个表中。Sales&Purchase表都共享来自第三个表存储的外键 构造查询以获得与结果表完全相同的结果的最佳方法是什么,最好(如果可能)不使用子查询,因为我需要创建查询结果的视图,而MYSQL不允许使用子查询创建查询视图 我尝试了使用union选择,但没有得到预期的结果 以下查询(未测试)应给出所需的结果集:用于组合共享第三个表外键的两个表的数据的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
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
这个查询对我不起作用。顺便说一句,有没有其他方法,比如从这些现有的表中创建一个新表来获得结果?请更具体地说明它是如何不适合您的。如果您看到任何错误消息,请在此处写入该消息,如果它给出的结果与您预期的后示例数据和您应该得到的结果不同,等等。还要确保复制完整的查询,因为它不适合窗口,您必须向下滚动才能看到所有查询。