left join 避免关联查询数据缺失或多余
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 避免关联查询数据缺失或多余相关推荐
- 关联查询数据重复怎么办_在设计数据表的时候,是一个宽表好,还是多个维度表好?...
数据仓库每张表的搭建,主要依赖于这个表在整个数据仓库中的作用和相关意义.首先要清楚这个表的存在是为了解决那些问题,什么角色使用,怎么保证使用者尽可能好的体验解决问题. 从以上所提到的角度去看待问题,拆 ...
- ThinkPhP关联查询setEagerlyType遇到的问题
setEagerlyType参数的区别 setEagerlyType(0)代表使用的是join查询,会在查询的时候把其他表join到sql语句中,从而在查询时可以使用其他表的字段进行查询,而setEa ...
- 【Laravel笔记】10. 模型的关联查询
关于 拾年之璐 微信公众号:知行校园汇,点击查看,欢迎关注 其他平台(点击蓝字可访问): GitHub | Gitee | 哔哩哔哩 | 语雀 | 简书 | 微信小程序 | 知行达摩院 本文专栏:La ...
- mysql授权、关联查询、主外键关系
创建用户: 无密码: create user bbb@localhost; 加密码的: create user bbb@localhost identified by "123"; ...
- Hibernate关联查询
本文由广州疯狂软件java培训分享: 很多人认为hibernate一旦涉及到多张表查询就很不方便,只能通过原声sql解决,其实不然,hql语句其实已经比较强大了,基本涵盖了sql的60%的功能.我认为 ...
- 二十八、PHP框架Laravel学习笔记——模型的关联查询
二.关联查询 前几篇博文,了解了三种基础的关联模型,并简单的进行查询: 本节课,我们详细的了解更多的查询方案: //下面两种查询是一样的: $books = User::find(19)->bo ...
- SQL两表关联查询(两表会了,三表,四表都小意思)
2019独角兽企业重金招聘Python工程师标准>>> 这几天在php群里吹牛逼,看到一个sql表关联查询问题,以前就想写,一直没总觉,实话说,我去年这个时候一表查询都不会,说来惭愧 ...
- php三表关联查询,SQL两表关联查询(两表会了,三表,四表都小意思)
这几天在php群里吹牛逼,看到一个sql表关联查询问题,以前就想写,一直没总觉,实话说,我去年这个时候一表查询都不会,说来惭愧,闲话不多说,正题开始: 首先是news表 下面是newscate表 // ...
- mysql 查找数据_Mysql查询数据
查询语句 单表查询 1.1 全表查寻 select * from employee; 复制代码1.2 指定字段查询 查询职员表中所有职员姓名和入职时间 select empname,hirdate f ...
最新文章
- 第五篇:HMM 隐马尔可夫模型
- [RHEL] RHEL7.0 下 Postfix + Dovecot 实现邮件发送
- spark写mysql优化简书_spark——通过jdbc连接数据库中遇到的问题
- html5中加亮文本,html实现高亮关键字
- BootstrapTable冻结表头(二)
- JavaScript浮点运算的问题
- MESSL(maven + extjs + spring portlet mvc + spring web flow + liferay )整合架构 7
- 编程实现strcmp函数
- ASP.NET WebAPI导入EXCEL数据
- PMP第十一章:项目风险管理
- matlab中注释多行
- Python 获取Windows关机消息
- 递归实现顺序输出整数
- 电脑如何设置定时关机?
- Flutter上线项目实战——环信客服插件
- PTA题目:7-9 抢红包 (25分)
- ASP.NET Core 基础(十三)——模型绑定与模型验证
- 199美元的iPhone和磨刀霍霍的程序员
- DeadException
- VMware vSphere 6.7 虚拟化搭建及配置完整详细手册 | 周末送资料