为何两条SQL查询语句返回结果不一致?请帮忙解析原因
两条SQL查询结果不同的原因分析
先拆解两个查询的核心逻辑差异:
第一个查询的逻辑
- 先过滤掉所有被取消的订单(
order_id NOT IN (已取消的订单ID)) - 按「用户ID+日期」分组,筛选出当天恰好有1个有效订单的用户-日期组合
- 最后按日期分组,统计每个日期下符合上述条件的用户数量(用户去重,因为一个用户当天只会出现在一个分组里)
这个查询统计的是每个日期里,当天刚好下了1个未取消订单的用户数。
第二个查询的逻辑
- 子查询和第一个一样,先找出所有「某一天恰好有1个有效订单」的用户(注意这里只取了user_id,没关联日期)
- 外层查询从
user_actions中筛选出所有这些用户的记录,不管这些记录对应的日期是不是他们符合条件的那天 - 最后按日期分组,对这些用户去重统计数量
问题就出在这里:假设用户A在1月1日符合「当天1个有效订单」的条件,同时用户A在1月2日还有其他订单(哪怕是被取消的,或者多个有效订单),那么在第二个查询的1月2日分组里,用户A依然会被统计进去。而第一个查询的1月2日分组里,只有那些在1月2日当天恰好有1个有效订单的用户才会被统计。
举个具体例子:
- 用户A:1月1日有1个未取消订单,1月2日有2个未取消订单
- 用户B:1月2日有1个未取消订单
第一个查询结果:
- 1月1日:1(只有A)
- 1月2日:1(只有B)
第二个查询结果:
- 1月1日:1(A)
- 1月2日:2(A和B,因为A属于子查询里的用户,不管他1月2日的订单数是多少)
这就是两条查询结果不同的核心原因:第一个是按日期统计当天符合条件的用户,第二个是统计所有曾经符合过条件的用户在每个日期的出现情况。
内容的提问来源于stack exchange,提问作者Анастасия Борзова
相关产品推荐
相关产品推荐

