当加入Many to Many表时,SUM()无法正常工作

时间:2016-04-05 11:00:13

标签: mysql join many-to-many

注意:我看到了类似的SQL问题,但没有针对MySQL如何解决这个问题。

我有以下查询,它根据销售表中的销售日期按天计算产品价值,可以根据类别筛选产品,这就是我需要左联接的类别,类别也需要与其他信息一起显示。由于项目要求,我无法在此MySQL查询之外进行任何处理。

select `sales`.`sell_date` as `date`, SUM(product_value.value) as value from 
   `sales` left join `products` on `sales`.`product_id` = `products`.`id` left join
   `product_value` on `product_value`.`product_id` = `products`.`id` and 
   `sales`.`sell_date` BETWEEN product_value.date_from AND 
   IFNULL(product_value.date_to, '2999-01-01') 
   left join `product_product_category` on `product_product_category`.`product_id` 
   = `products`.`id` left join `product_categories` on 
   `product_product_category`.`product_category_id` = `product_categories`.`id` 
   left join `users` on `sales`.`seller_id` = `users`.`id` 
   where `sales`.`sell_date` between "2016-02-01" and "2016-02-29" and `product_value`.`deleted_at` is null 
   and `products`.`id` in ("178") and `sales`.`deleted_at` is null group by 
  `sales`.`sell_date` order by `sales`.`sell_date` asc

当产品有两个或三个类别时,上面的查询将获得加倍或三倍的总和。类别可以是颜色,大小等等。

当我从查询中删除以下内容时,总和可以正常工作,这使我相信这里的多对多关系导致问题。

left join `product_product_category` on `product_product_category`.`product_id` =
 `products`.`id` left join `product_categories` on
 `product_product_category`.`product_category_id` = `product_categories`.`id`

如何防止此左连接导致我的SUM()给出错误的总值?

在product_value.value上使用Distinct不起作用,因为许多产品的产品价值可能相同。

我的桌子

销售

ID | sell_date  | product_id
----------------------------
2  | 2016-02-15 | 178

product_value

ID | value | date_from  | date_to    | product_id
-------------------------------------------------
1  | 500   | 2016-01-01 | NULL       | 178
2  | 500   | 2015-01-01 | 2015-12-01 | 392

产品

ID | name
----------
178  | ProductName

product_product_category

product_id | product_category_id
--------------------------------
178        | 1
178        | 2

product_categories

ID | name
---------
1  | Red
2  | Large

所以为了清楚这一点,如果我在这些表上运行上述查询,我​​会得到value = 1000但值应该是500. 如何确保SUM()在连接多个到多个时显示正确的值关系吗

1 个答案:

答案 0 :(得分:0)

您可以移除left join并在where中添加过滤器作为子查询

...
where
...
and exists (
    select 1
    from `product_product_category`
        inner join `product_categories` on `product_product_category`.`product_category_id` = `product_categories`.`id` 
    where `product_product_category`.`product_id` = `products`.`id`
        and ....
        and ....
)
...