MySQL关联两表后无法显示指定时段未售出到货商品问题
基于订单日期筛选,展示所有到货商品的售出统计(含未售出)
需求与问题
需求:展示指定时段内所有已售出和未售出的到货商品。
问题:使用LEFT JOIN关联arrivals表与orders表时,若在WHERE条件中筛选orders.date介于'2022-11-01'至'2022-12-20'之间,会导致未售出的到货商品无法被查询到;若改用arrivals.date作为筛选条件,虽然能显示全部到货商品,但不符合“基于订单表日期筛选”的要求。
原SQL语句
select arrivals.description, COALESCE(sum(orders.quantity ), 0) as quantity from arrivals left join orders on arrivals.description = orders.description where orders.date between '2022-11-01' and '2022-12-20' group by orders.description
ORDERS表数据
| id | date | description | quantity |
|---|---|---|---|
| 7 | 2022-11-27 | nike 500 black 70 | 1 |
| 1 | 2022-11-24 | nike 500 black 70 | 1 |
| 2 | 2022-11-24 | nike 500 black 60 | 1 |
| 6 | 2022-11-28 | adidas 1000 white 90 | 1 |
| 5 | 2022-11-27 | adidas 1000 white 90 | 1 |
| 4 | 2022-10-31 | adidas 1000 white 90 | 1 |
| 3 | 2022-10-31 | adidas 1000 white 80 | 1 |
ARRIVALS表数据
| id | date | description | quantity |
|---|---|---|---|
| 1 | 2022-10-30 | nike 500 black 50 | 2 |
| 2 | 2022-10-30 | nike 500 black 60 | 3 |
| 3 | 2022-10-30 | nike 500 black 70 | 4 |
| 4 | 2022-10-29 | adidas 1000 white 80 | 2 |
| 5 | 2022-10-29 | adidas 1000 white 90 | 3 |
| 6 | 2022-10-29 | adidas 1000 white 110 | 2 |
当前执行结果
| description | quantity |
|---|---|
| nike 500 black 60 | 1 |
| nike 500 black 70 | 2 |
| adidas 1000 white 90 | 2 |
解决方案
问题核心:LEFT JOIN后,未售出商品对应的orders表字段全为NULL,WHERE orders.date BETWEEN ...会直接排除这些NULL行。需将订单日期的筛选条件移至LEFT JOIN的ON子句中,同时GROUP BY要基于arrivals.description(避免因orders.description为NULL导致分组异常)。
修正后的SQL语句:
select arrivals.description, COALESCE(sum(orders.quantity), 0) as quantity from arrivals left join orders on arrivals.description = orders.description and orders.date between '2022-11-01' and '2022-12-20' group by arrivals.description
预期执行结果
| description | quantity |
|---|---|
| nike 500 black 50 | 0 |
| nike 500 black 60 | 1 |
| nike 500 black 70 | 2 |
| adidas 1000 white 80 | 0 |
| adidas 1000 white 90 | 2 |
| adidas 1000 white 110 | 0 |
内容的提问来源于stack exchange,提问作者Jorgefilemon
相关产品推荐
相关产品推荐

