一分一毛也是爱

微信

微信

支付宝

支付宝

观海听潮

观海听潮博客

登录
还没有账号?去注册
观海听潮

观海听潮博客

注册
  • 欢迎来自美国弗吉尼亚州的访客,您好!
×

我的名片

网名:观海听潮

职业:PHP开发工程师

现居:山东省-青岛市

Email:1256699215@qq.com

网站统计

  • 观海听潮•博客
  • 54篇
  • 145条
  • 22684次
  • 295次
  • 美国弗吉尼亚州

您现在的位置是:首页  > 技术杂谈  > mysql mysql

观海听潮

left join遇到where条件

摘要
left join连表查询碰到where条件后,会变成inner join,查到的数据会变少,出现问题。

left join的困惑:一旦加上where条件,则显示的结果等于inner join 

原操作:select a.*,b.* from table1 a left join table2 b on b.X=a.X where XXX

原因分析:

数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户;

where条件是在临时表生成好后,再对临时表进行过滤的条件;

因此:where 条件加上,已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。 

解决方案:

1、where过滤结果作为子查询,和主表left,如下:

select a.*,tmp.*from table1 aleft join(    select a.*,b.*    from table1 a    left join table2 b on b.X=a.X    where XXX )

个人理解:将子表写通过where查询后作为临时表再和主表关联再成为临时表。

很明显,子查询语句无论 left join、inner join都没啥区别了

2、查询条件放在on后面

1

2

3

select a.*,b.*

from table1 a

left join table2 b on b.X=a.X and XXX

注意:where XXX去掉,改为链接条件on后面的 and XXX

分析:

 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。

个人理解:将where查询条件当作关联条件去关联。


转载请注明: 观海听潮博客

本文地址:https://chengzhigang.cn/al/30.html

讨厌 (0)
微博logo QQ空间logo QQlogo 豆瓣logo 人人logo 百度贴吧logo 有道云笔记logo

文章评论

表情表情
×
图片图片

评论列表