left join是很常见的多表关联查询,比如服装类下面有多少件衣服,衣服对应的有多少图片,每个衣服下面有多少个评论,等等。但是由于对join、on的用法不熟悉,可能会导致得不到预期的效果。
假如一个产品管理业务,有两张表category(分类)和product(产品),具体信息如下:
category数据

id type
1 服装
2
3 手机数码
4 家用电器

product数据

id category_id name price
1 1 羽绒服 888.88
2 1 棉服 666.66
3 2 耐克鞋 660
4 2 休闲鞋 300
5 3 oppoR9 1200
6 3 vivo 2000
  • 需求一:查询每个类别及其价格大于800的的产品总数量
  • 需求二:查询服装的产品总数量

需求一大多数人是这两种sql:
第一种sql

SELECT c.type,COUNT(p.name) sum
FROM category c
LEFT JOIN product p ON c.id=p.category_id
WHERE p.price>800
GROUP BY c.id

运行结果

type sum
服装 1
手机数码 2

第二种sql

SELECT c.type,COUNT(p.name) sum
FROM category c
LEFT JOIN product p ON c.id=p.category_id AND p.price>800
GROUP BY c.id

运行结果

type sum
服装 1
0
手机数码 2
家用电器 0

需求二大多数人是这两种sql:
第一种sql

SELECT c.type,COUNT(p.name) sum
FROM category c
LEFT JOIN product p ON c.id=p.category_id AND c.type='服装'
GROUP BY c.id

运行结果

type sum
服装 2
0
手机数码 0
家用电器 0

第二种sql

SELECT c.type,COUNT(p.name) sum
FROM category c
LEFT JOIN product p ON c.id=p.category_id
WHERE c.type='服装'
GROUP BY c.id

运行结果

type sum
服装 2

正确答案都是第二种。
因为需求一第一种方式由于在where条件中对右表进行限制,导致数据缺失;
需求二第一种方式由于在on条件中对左表进行限制,并没有对最终的结果进行限制,导致数据多余。

总结:
在使用 left join 时,如果对左表过滤必须放在 where 条件中;如果对右表过滤放在 on 条件中。避免结果数据多余或缺失。

left join 避免关联查询数据缺失或多余相关推荐

  1. 关联查询数据重复怎么办_在设计数据表的时候,是一个宽表好,还是多个维度表好?...

    数据仓库每张表的搭建,主要依赖于这个表在整个数据仓库中的作用和相关意义.首先要清楚这个表的存在是为了解决那些问题,什么角色使用,怎么保证使用者尽可能好的体验解决问题. 从以上所提到的角度去看待问题,拆 ...

  2. ThinkPhP关联查询setEagerlyType遇到的问题

    setEagerlyType参数的区别 setEagerlyType(0)代表使用的是join查询,会在查询的时候把其他表join到sql语句中,从而在查询时可以使用其他表的字段进行查询,而setEa ...

  3. 【Laravel笔记】10. 模型的关联查询

    关于 拾年之璐 微信公众号:知行校园汇,点击查看,欢迎关注 其他平台(点击蓝字可访问): GitHub | Gitee | 哔哩哔哩 | 语雀 | 简书 | 微信小程序 | 知行达摩院 本文专栏:La ...

  4. mysql授权、关联查询、主外键关系

    创建用户: 无密码: create user bbb@localhost; 加密码的: create user bbb@localhost identified by "123"; ...

  5. Hibernate关联查询

    本文由广州疯狂软件java培训分享: 很多人认为hibernate一旦涉及到多张表查询就很不方便,只能通过原声sql解决,其实不然,hql语句其实已经比较强大了,基本涵盖了sql的60%的功能.我认为 ...

  6. 二十八、PHP框架Laravel学习笔记——模型的关联查询

    二.关联查询 前几篇博文,了解了三种基础的关联模型,并简单的进行查询: 本节课,我们详细的了解更多的查询方案: //下面两种查询是一样的: $books = User::find(19)->bo ...

  7. SQL两表关联查询(两表会了,三表,四表都小意思)

    2019独角兽企业重金招聘Python工程师标准>>> 这几天在php群里吹牛逼,看到一个sql表关联查询问题,以前就想写,一直没总觉,实话说,我去年这个时候一表查询都不会,说来惭愧 ...

  8. php三表关联查询,SQL两表关联查询(两表会了,三表,四表都小意思)

    这几天在php群里吹牛逼,看到一个sql表关联查询问题,以前就想写,一直没总觉,实话说,我去年这个时候一表查询都不会,说来惭愧,闲话不多说,正题开始: 首先是news表 下面是newscate表 // ...

  9. mysql 查找数据_Mysql查询数据

    查询语句 单表查询 1.1 全表查寻 select * from employee; 复制代码1.2 指定字段查询 查询职员表中所有职员姓名和入职时间 select empname,hirdate f ...

最新文章

  1. 第五篇:HMM 隐马尔可夫模型
  2. [RHEL] RHEL7.0 下 Postfix + Dovecot 实现邮件发送
  3. spark写mysql优化简书_spark——通过jdbc连接数据库中遇到的问题
  4. html5中加亮文本,html实现高亮关键字
  5. BootstrapTable冻结表头(二)
  6. JavaScript浮点运算的问题
  7. MESSL(maven + extjs + spring portlet mvc + spring web flow + liferay )整合架构 7
  8. 编程实现strcmp函数
  9. ASP.NET WebAPI导入EXCEL数据
  10. PMP第十一章:项目风险管理
  11. matlab中注释多行
  12. Python 获取Windows关机消息
  13. 递归实现顺序输出整数
  14. 电脑如何设置定时关机?
  15. Flutter上线项目实战——环信客服插件
  16. PTA题目:7-9 抢红包 (25分)
  17. ASP.NET Core 基础(十三)——模型绑定与模型验证
  18. 199美元的iPhone和磨刀霍霍的程序员
  19. DeadException
  20. VMware vSphere 6.7 虚拟化搭建及配置完整详细手册 | 周末送资料

热门文章

  1. netty 简单demo
  2. 电厂/矿井UWB室内定位解决方案
  3. DNS解析记录中的CNAME与URL重定向(301/302)区别
  4. 月薪20KPython程序员2018年Python学习进阶书籍推荐
  5. Ubuntu下安装mer-gx系列相机驱动
  6. 涪陵计算机二级培训机构排名,涪陵计算机培训_众鑫教育信得过的品牌
  7. 机器学习基础--回归(Regression)
  8. 计算机基础知识中真值是什么,计算机中什么叫机器数,什么叫真值
  9. 前端基础:通过表单元素实践《健康体检单》
  10. 面试题之数据库脏读、不可重复读、幻读