工作中,今天用到左连接查询,我自己造的数据,需要根据条件进行筛选,但是筛选不符合我的要求,最终发现是左右连接中where和on的区别,在作怪,工作中用的表关联太多,我下面简化要点,仅仅把注意点写个简单的东西搞出来,已做记录

如下:(因为简化了大家可能觉得很简单,但是多张表放一块有可能会搞错,所以连接查询为自己设定个写代码的标准吧)

比如:

我想要的结果是

但是实际查出来的是如下很多

直接上重点

原因是两句sql语句的差别

第一个图的语句是SELECT * FROM d_device d LEFT JOIN d_device_user_bind dub ON d.`id`=dub.`device_id` WHERE d.`company_id`='gdl'

第二个图的语句是:SELECT * FROM d_device d LEFT JOIN d_device_user_bind dub ON d.`id`=dub.`device_id` AND d.`company_id`='gdl'

对,就是这两个不起眼的差别,在左右连接查询中,过滤条件d.`company_id`='gdl'没有起作用

如果用内连接查询结果一样

语句分别是:

SELECT * FROM d_device d INNER JOIN d_device_user_bind dub ON d.`id`=dub.`device_id` AND d.`company_id`='gdl'

SELECT * FROM d_device d INNER JOIN d_device_user_bind dub ON d.`id`=dub.`device_id` WHERE d.`company_id`='gdl'

结果均一样

为此,自己在以后写连接查询时候,定义一个原则,凡是跟两张表相关(表示两张表有引用关系)的比如 d.id=dub.id的语句放在on后面,凡是没关系的只是单表的过滤条件的则可以放在where后面即可减少或者避免很多麻烦。

网上查找原因分析:

在使用left join时,on and和on where条件的区别如下:  
1、on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。  
2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉,on后的条件用来生成左右表关联的临时表,where后的条件对临时表中的记录进行过滤。

可以参考如下博客详细了解:

1. https://blog.csdn.net/xingzhemoluo/article/details/39677891 点击打开链接

2.https://www.cnblogs.com/aspwebchh/p/6726181.html 点击打开链接

最新文章

  1. codevs 2830 蓬莱山辉夜
  2. C算法编程题(三)画表格
  3. C#复习④
  4. JQuery html API支持解析执行Javascript脚本功能实现-代码分析
  5. Google工程师打造Remix OS系统 桌面版安卓下载
  6. iOS之block块
  7. eclipse增加浏览器chrome
  8. Oracle 基础知识
  9. linux下单独安装oracle12.1客户端
  10. 优化器的使用oracle ---explain plan
  11. 写一篇 Bootstrap弹窗确认的文章。本周完成
  12. Bootstrap相关的网站
  13. Android实训案例(九)——答题系统的思绪,自己设计一个题库的体验,一个思路清晰的答题软件制作过程
  14. full join no满连接的使用
  15. docker 创建docker用户组,应用用户加入用户组
  16. DBUtils数据库连接池
  17. Elasticsearch 整合spring(不是sprig boot)
  18. Postman无法正常启动解决办法
  19. Spring Security构建Rest服务-0600-SpringSecurity基本原理
  20. input必填

热门文章

  1. js运算符的特殊应用
  2. SignalR Connection has not been fully initialized
  3. Centos7 nginx的目录结构与nginx主配置文件解析
  4. Memcached 最新版本发布,不再仅仅是个内存缓存了
  5. UOJ Contest #50: Goodbye Jihai
  6. php 实现店铺装修6
  7. java多线程知识回顾(笔记)
  8. eot文件
  9. C++ 类 与 static
  10. 【LeetCode】113. 路径总和 II