left join 是以A表为基础,A表即左表,B表即右表。

左表(A)的记录会全部显示,而右表(B)只会显示符合条件表达式的记录,如果在右表(B)中没有符合条件的记录,则记录不足的地方为NULL。

例如:news 与 news_category表的结构如下,news表的category_id与news_category表的id是对应关系。

news 表

id title category_id content addtime lastmodify
1 fashion news title 1 fashion news content 2015-01-01 12:00:00 2015-01-01 12:00:00
2 sport news title 2 sport news content 2015-01-01 12:00:00 2015-01-01 12:00:00
3 life news title 3 life news content 2015-01-01 12:00:00 2015-01-01 12:00:00
4 game news title 4 game news content 2015-01-01 12:00:00 2015-01-01 12:00:00

news_category 表

id name
1 fashion
2 sport
3 life

显示news表记录,并显示news的category名称,查询语句如下

select a.id,a.title,b.name as category_name,a.content,a.addtime,a.lastmodify
from news as a left join news_category as b
on a.category_id = b.id;

查询结果如下:

id title category_name content addtime lastmodify
1 fashion news title fashion fashion news content 2015-01-01 12:00:00 2015-01-01 12:00:00
2 sport news title sport sport news content 2015-01-01 12:00:00 2015-01-01 12:00:00
3 life news title life life news content 2015-01-01 12:00:00 2015-01-01 12:00:00
4 game news title NULL game news content 2015-01-01 12:00:00 2015-01-01 12:00:00

因 news_category 表没有id=4的记录,因此news 表中category_id=4的记录的category_name=NULL

使用left join, A表与B表所显示的记录数为 1:1 或 1:0,A表的所有记录都会显示,B表只显示符合条件的记录。

2.left join 右表数据不唯一解决方法

但如果B表符合条件的记录数大于1条,就会出现1:n的情况,这样left join后的结果,记录数会多于A表的记录数。

例如:member与member_login_log表的结构如下,member记录会员信息,member_login_log记录会员每日的登入记录。member表的id与member_login_log表的uid是对应关系。

member 表

id username
1 fdipzone
2 terry

member_login_log 表

id uid logindate
1 1 2015-01-01
2 2 2015-01-01
3 1 2015-01-02
4 2 2015-01-02
5 2 2015-01-03

查询member用户的资料及最后登入日期:

如果直接使用left join

select a.id, a.username, b.logindate
from member as a
left join member_login_log as b on a.id = b.uid;

因member_login_log符合条件的记录比member表多(a.id = b.uid),所以最后得出的记录为:
id username logindate
1 fdipzone 2015-01-01
1 fdipzone 2015-01-02
2 terry 2015-01-01
2 terry 2015-01-02
2 terry 2015-01-03

但这并不是我们要的结果,因此这种情况需要保证B表的符合条件的记录是空或唯一,我们可以使用group by来实现。

select a.id, a.username, b.logindate
from member as a
left join (select uid, max(logindate) as logindate from member_login_log group by uid) as b
on a.id = b.uid;

id username logindate
1 fdipzone 2015-01-02
2 terry 2015-01-03

总结:使用left join的两个表,最好是1:1 或 1:0的关系,这样可以保证A表的记录全部显示,B表显示符合条件的记录。
如果B表符合条件的记录不唯一,就需要检查表设计是否合理了。
---------------------
作者:傲雪星枫
来源:CSDN
原文:https://blog.csdn.net/fdipzone/article/details/45119551
版权声明:本文为博主原创文章,转载请附上博文链接!

left join的更多相关文章

  1. SQL Server-聚焦IN VS EXISTS VS JOIN性能分析(十九)

    前言 本节我们开始讲讲这一系列性能比较的终极篇IN VS EXISTS VS JOIN的性能分析,前面系列有人一直在说场景不够,这里我们结合查询索引列.非索引列.查询小表.查询大表来综合分析,简短的内 ...

  2. SQL Server-聚焦NOT IN VS NOT EXISTS VS LEFT JOIN...IS NULL性能分析(十八)

    前言 本节我们来综合比较NOT IN VS NOT EXISTS VS LEFT JOIN...IS NULL的性能,简短的内容,深入的理解,Always to review the basics. ...

  3. Nested Loops join时显示no join predicate原因分析以及解决办法

    本文出处:http://www.cnblogs.com/wy123/p/6238844.html 最近遇到一个存储过程在某些特殊的情况下,效率极其低效, 至于底下到什么程度我现在都没有一个确切的数据, ...

  4. c# Enumerable中Aggregate和Join的使用

    参考页面: http://www.yuanjiaocheng.net/ASPNET-CORE/asp.net-core-environment.html http://www.yuanjiaochen ...

  5. 超详细mysql left join,right join,inner join用法分析

    下面是例子分析表A记录如下: aID        aNum 1           a20050111 2           a20050112 3           a20050113 4   ...

  6. join Linq

    List<Publisher> Publishers = new List<Publisher>(); Publisher publish1 = new Publisher() ...

  7. mysql join 和left join 对于索引的问题

    今天遇到一个left join优化的问题,搞了一下午,中间查了不少资料,对MySQL的查询计划还有查询优化有了更进一步的了解,做一个简单的记录: select c.* from hotel_info_ ...

  8. BCL中String.Join的实现

    在开发中,有时候会遇到需要把一个List对象中的某个字段用一个分隔符拼成一个字符串的情况.比如在SQL语句的in条件中,我们通常需要把List<int>这样的对象转换为“1,2,3”这样的 ...

  9. [数据库基础]——图解JOIN

    阅读导航 一.概要 二.JOIN分类 三.JOIN分类详解 一.概要 JOIN对于接触过数据库的人,这个词都不陌生,而且很多人很清楚各种JOIN,还有很多人对这个理解也不是很透彻,这次就说说JOIN操 ...

  10. Spark join 源码跟读记录

    PairRDDFunctions类提供了以下两个join接口,只提供一个参数,不指定分区函数时默认使用HashPartitioner;提供numPartitions参数时,其内部的分区函数是HashP ...

随机推荐

  1. MongoSpark 28799错误

    Exception : . The full response is { , "codeName" : "Location28799" } at com.mon ...

  2. transition属性值

    一.transition-property: transition-property是用来指定当元素其中一个属性改变时执行transition效果,其主要有以下几个值:none(没有属性改变):all ...

  3. qemu 对虚机的地址空间管理

    转载:http://huchh.com/2015/06/22/qemu-%E5%AF%B9%E8%99%9A%E6%9C%BA%E7%9A%84%E7%BA%BF%E6%80%A7%E5%9C%B0% ...

  4. UValive4195 Heroes of Money and Magic

    斜率优化 想骂人了,马格吉最后调了半小时 TMD造数据的人是SB吧? 我写  while(scanf("%d%d",&n,&m)!=EOF&&n) ...

  5. 20190408Linux权限管理week1_day5

    权限概述 Linux系统一般将文件可存/取访问的身份分为3个类别:owner(拥有者).group(和所有者同组的用户).others(其他人,除了所有者,除了同组的用户以及除了超级管理员),且3种身 ...

  6. 定位bug的基本要求

    很多人觉得qa只是负责发现问题,这个实在太狭隘了,现代qa除了发现问题这种基本功外,定位问题,提出解决方案,提出预防方案也是要掌握的技能.这里先说定位问题的要求,定位问题要向深入,前提当然是对功能.产 ...

  7. 配置firewalld端口转发

    题:在系统 system1 设定端口转发,要求: 1.在172.24.8.0/24网络中的系统,访问system1的本地端口 5423 将被转发到 80 2.此设置必须永久有效 答: # 配置转发端口 ...

  8. jquery easyui的应用-2

    有两个版本: freeware edition, commercial edition easyui的 datagrid 实际上是一个table, 其数据来源 通过 url属性来从后台的php页面 获 ...

  9. P3181 [HAOI2016]找相同字符

    思路 广义SAM 把两个字符串建成广义SAM,然后统计两个SAM中相同节点的endpos大小乘积即可 记得开long long 代码 #include <cstdio> #include ...

  10. 如何在基于Bytom开发过程中使用Bigchaindb

    上期我们讲了在基于比原开发过程中链外存储可以用分布式存储IPFS,这期我们还给大家介绍另外一种链外存储的解决方案.bigchaindb:https://www.bigchaindb.com,下面我们讲 ...