gpt4 book ai didi

mysql - 离开连接多对多表时 SUM() 无法正常工作

转载 作者:行者123 更新时间:2023-11-29 21:10:23 25 4
gpt4 key购买 nike

注意:我看到类似的 SQL 问题,但没有任何具体针对 MySQL 的关于如何解决此问题的信息。

我有以下查询,它根据销售表中的销售日期按天对一段时间内的产品值(value)进行求和,可以根据类别过滤产品,这就是为什么我需要左连接,类别也需要与其余信息一起显示。由于项目要求,我无法在此 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将不起作用,因为许多产品的产品值可能相同。

我的 table

销售

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

产品值(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_id | product_category_id
--------------------------------
178 | 1
178 | 2

产品类别

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

因此,为了明确这一点,如果我在这些表上运行上述查询,我​​将得到 value = 1000,但值应该为 500。 如何确保 SUM() 在连接多对多时显示正确的值关系?

最佳答案

您可以删除左连接并在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 ....
)
...

关于mysql - 离开连接多对多表时 SUM() 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36424534/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com