注意:我看到了类似的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()在连接多个到多个时显示正确的值关系吗
答案 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 ....
)
...