使用JOINS和GROUP BY进行MySQL查询

时间:2012-11-26 17:01:46

标签: mysql join group-by

我正在构建一个MySQL查询,但我似乎无法做到正确。

我有四张桌子:
- 客户
- 订单
- sales_rates
- purchase_rates

客户与订单之间存在1:n关系'customernr' 订单和sales_rates之间存在1:n关系'ordernr'。 订单和purchase_rates之间存在1:n关系'ordernr'。

我想做的是为所有客户提供他们的总购买和销售额的输出。

到目前为止,我有以下查询。

SELECT c.customernr, c.customer_name, SUM(sr.sales_price) AS sales_price, SUM(pr.purchase_price) AS purchase_price
FROM orders o, customers c, sales_rates sr, purchase_rates pr
WHERE o.customernr = c.customernr
AND o.ordernr = sr.ordernr
AND o.ordernr = pr.ordernr
GROUP BY c.customer_name

sales_price和purchase_price的结果太高了。我似乎得到了双重数字。我究竟做错了什么?是否可以在单个查询中执行此操作?

感谢您的回复!

2 个答案:

答案 0 :(得分:0)

看起来您不是在按客户分组。 C.customerid或类似的东西。

答案 1 :(得分:0)

似乎问题在于,当您将订单表加入具有销售率和购买率的表时,您将获得后两个表的笛卡尔积。 I.e 这两个表中的每一行对于另一个表中的每个相应行重复一次。以下查询应通过在将销售率和购买率加入其他表之前对每个订单的费率求和来解决此问题:

SELECT c.customernr, c.customer_name,
       SUM(sr.sales_price) AS sales_price,
       SUM(pr.purchase_price) AS purchase_price
FROM customers c
INNER JOIN orders o
ON o.customernr = c.customernr
LEFT JOIN (SELECT ordernr, SUM sales_price) AS sales_price
           FROM sales_rates
           GROUP BY ordernr) sr
ON sr.ordernr = o.ordernr
LEFT JOIN (SELECT ordernr, SUM(purchase_price) AS purchase_price
           FROM purchase_rates
           GROUP BY ordernr) pr
ON pr.ordernr = o.ordernr
GROUP BY c.customernr, c.customer_name;