mysql left join中where条件和on条件的区别

假设现在有表t1, t2, t3,t1通过id左关联t2,  t2通过id左关联t3,  要统计t3中关联t1(8, 9, 10, 11, 722, 723, 724)数量?

两种写法:

SQL1:

select
  t1.id,
  count(t3.id) as totalQuestionCnt
from eas_label t1
  left join eas_question_label t2 on t1.id = t2.label_id and t2.del_flag = 0
  left join eas_question t3 on t2.question_id = t3.id and t3.del_flag = 0
where t1.id in (
  8, 9, 10, 11, 722, 723, 724
)
      and t1.del_flag = 0
group by t1.id;

输出:

SQL2:

select
  t1.id,
  count(t3.id) as totalQuestionCnt
from eas_label t1
  left join eas_question_label t2 on t1.id = t2.label_id
  left join eas_question t3 on t2.question_id = t3.id
where t1.id in (
  8, 9, 10, 11, 722, 723, 724
)
and t1.del_flag = 0
and t2.del_flag = 0
and t3.del_flag = 0
group by t1.id;

输出:

区别:

      比较两种sql,发现数据都相同,唯一的区别在于,如果t1在t2或t3中没有关联数据,那么第一种写法会保留t1的所有数据,id为8, 9, 10, 11, 722, 723, 724的t1记录都在,没有关联数据,则totalQuestionCnt都为0;

而第二种写法是直接去除没有关联记录的t1数据,只保留在t2和t3中有关联数据的记录,即只有id为8和9的t1数据。

原因:

      两种返回结果的差异原因,在于where条件在时生成临时表时过滤数据,这个临时表就是t1和t2和t3的关联表,就是在关联后,进行过滤;

而on条件是在生成临时表之前过滤数,就是说先过滤t2,t3,然后再跟t1关联,这时候,t1的所有数据都会保留。

总结:

      两种写法都对,只是要看场景,具体看需求是,是否当没有关联数据时,left join 左表的数据是否保留。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
MySQLLEFT JOIN是一种连接查询的方式,可以链接两个或多个格。当使用LEFT JOIN时,将边的格的所有记录与右边格的匹配记录连接起来,而不管右边格的记录是否存在。 在LEFT JOIN,将条件放在ON和WHERE子句区别如下: 1. ON子句:这是在连接两个格时使用的条件。在ON子句,我们可以指定要使用的列进行连接,例如:ON table1.column = table2.column。通过在ON子句指定连接条件,可以确保将两个匹配的记录连接起来。如果在ON子句省略连接条件,则会返回格的所有记录与右边格的每条记录的组合。 2. WHERE子句:该子句用于在连接两个格之后对结果进行筛选。在WHERE子句,我们可以使用条件对连接后的结果进行筛选,例如:WHERE column1 = value。通过在WHERE子句指定过滤条件,可以从连接后的结果选择满足条件的记录。如果在WHERE子句省略条件,则返回连接后的所有记录。 因此,ON子句用于连接两个格,而WHERE子句用于筛选连接后的结果。放置条件的不同位置会对查询结果产生不同的影响。当连接条件放在ON子句时,会在连接时对两个格进行匹配。而当条件放在WHERE子句时,会在连接后对匹配的结果进行过滤。 总结:ON子句用于连接格,WHERE子句用于筛选连接后的结果。根据具体需求,我们可以选择将条件放置在ON子句或WHERE子句来实现不同的查询目的。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xinqing5130

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值