mysql外连接
一,起因
在学习一个新知识之前,最好先了解一下你为何要学习这个知识,这个知识或技术能帮你做什么,可以给你带来哪些帮助。
因此我先交代一下写这篇随笔的起因。
我在做项目的时候遇到了一个比较有意思的情况,
首先说明我有如下两个比较重要的表
分别是 comment_table 和 comment_pic_table
这两个表分别用于存评论和评论附带的图片
下面是我以前出问题的查询sql
SELECT c.*,u.user_phone,u.user_headPic,u.user_email,p.comment_pic_path
FROM
comment_table c,user_info_table u,comment_pic_table p
WHERE
c.user_id=u.user_id AND
p.comment_id=c.comment_id AND
homestay_id='' ORDER BY comment_time DESC
LIMIT 0,3
你只需要注意我将comment_table 和comment_pic_table关联。
因为我想要查询完整的评论,肯定是要将二者关联起来的。
如此问题就来了。
对于有图片的评论,这样固然可以完整的查出我想要的数据(评论本身和评论图片)。
但是,对于没有图片的评论,则该sql一条记录都查不出来。
这是由于 p.comment_id=c.comment_id 这个条件导致的。(因为没有图片,自然"p"表comment_id对应的记录为null。)
学过sql的看到这里应该已经发现问题了,没发现的自己慢慢看吧。
对此,我能想到的就是用外连接语法解决。
外连接分为左外连接,右外连接,和全外连接三种。
目前我还不清楚第三种的应用场景在哪里,当然,昨天我甚至不知道外连接有何作用,因为我从未使用过这种语法去实际的解决什么问题,即便我很早的便学习了外连接的概念和语法。
所以它的存在必然是有意义的,还是学了好。不然指不定以后哪天遇到问题了都不知道该用什么技术去解决这个问题。
知识的广度和深度是同级的。
二,定义
左外连接,就是将两个表关联查询,但是和内连接不同的是,对于关联查询没有满足搜索条件的记录,内连接一条都不显示,但左外连接仍然会显示左表的全部记录。(你可以给左表增加where条件再次过滤。)
三,代码
在了解了外连接的概念之后,我的sql就变成了如下形式:
SELECT c.*,u.user_phone,u.user_headPic,u.user_email,p.comment_pic_path
FROM
(
comment_table c INNER JOIN user_info_table u ON c.user_id=u.user_id
)
LEFT JOIN comment_pic_table p ON p.comment_id=c.comment_id
AND homestay_id=''
ORDER BY comment_time DESC
LIMIT 0,3
这种sql相比较之前的来说虽然查到数据了,但是仍然存在问题,就是多查了。
原因上面已经说了:左外连接仍然会显示左表的全部记录。
可能有同学会问了,你明明加了and过滤了啊,但是,这个and过滤的是右表的记录,而不是左表。因此左表依然显示全部记录。
对此我们再次做出修改,修改之后的sql如下:
SELECT c.*,u.user_phone,u.user_headPic,u.user_email,p.comment_pic_path
FROM
(
comment_table c INNER JOIN user_info_table u ON c.user_id=u.user_id
AND homestay_id=''
)
LEFT JOIN comment_pic_table p ON p.comment_id=c.comment_id
ORDER BY comment_time DESC
LIMIT 0,3
如此一来,我们就可以正确的查到想要的记录了。
mysql外连接的更多相关文章
- mysql 外连接总结
内连接: 只连接匹配的行左外连接: 包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行右外连接: 包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边 ...
- mysql 外连接的时候,条件在on后面和条件在where后面的区别
最近使用mysql的时候碰到一个问题:当一个表外联另一个表的时候,将一些查询条件放在on后面和放在where后面不太一样: 学生分数表stuscore: 当查询语句如下(查询语句1): SELECT ...
- mysql 外连接
自连接:最大的特点是:一张表看做两张表.自己连接自己. 找出每个员工的上级领导,要求显示员工名和对应的领导名. select e.ename,ee.ename from emp e join emp ...
- 解释 MySQL 外连接、内连接与自连接的区别 ?
先说什么是交叉连接: 交叉连接又叫笛卡尔积,它是指不使用任何条件,直接将一 个表的所有记录和另一个表中的所有记录一一匹配. 内连接 则是只有条件的交叉连接,根据某个条件筛选出符合条件的记录,不符合 条 ...
- 解释 MySQL 外连接、内连接与自连接的区别 ?
先说什么是交叉连接: 交叉连接又叫笛卡尔积,它是指不使用任何条件,直接将一 个表的所有记录和另一个表中的所有记录一一匹配. 内连接 则是只有条件的交叉连接,根据某个条件筛选出符合条件的记录,不符合 条 ...
- Mysql学习总结(25)——MySQL外连接查询
1.左外连接left outer join或者left jion,outer可以省略不写,下边的右连接和全连接也一样: 左外连接的意思是,以left join左边的表中的数据为基准,即左边的表中有的必 ...
- MySQL内连接和外连接
INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录. LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录. RIGHT JOIN(右连接): 与 LEF ...
- mysql学习笔记(七)—— MySQL内连接和外连接
MySQL内连接(inner join on) MySQL的内连接使用inner join on,它的效果跟使用where是一样的,如果联结的是两个表,那么需要左右的条件或者说字段是需要完全匹 ...
- mysql,SQL标准,多表查询中内连接,外连接,自然连接等详解之查询结果集的笛卡尔积的演化
先附上数据. CREATE TABLE `course` ( `cno` ) NOT NULL, `cname` ) CHARACTER SET utf8 NOT NULL, `ctime` ) NO ...
随机推荐
- Github相关知识
github的提交流程 mkdir 目录名 :创建一个空文件夹 mkdir webs webs代表创建的新文件名称 cd 目录名 :切换到文件夹 cd webs 切换到当前新建的目录下 ...
- Centos上通过shell脚本备份数据库
#!/bin/bash ds=`` list=`date +%Y`/`date +%m` dname="callme" eval "mkdir -p $list" ...
- cognos服务器性能测试诊断分析优化过程记录
前段时间客户方一个系统上线后出现性能问题,就是查询报表的时候出现宕机现象,应项目组要求过去帮忙测试优化问题. 该项目的架构相对比较复杂,登录后要先进行认证服务器认证用户然后登录到应用系统A,在跳转到 ...
- python变量、输入输出-xdd
1.注释 #输入身高,计算BMI 注释1,单行注释... 注释2,多行注释xiedong.. 2.中文编码声明,UTF-8编码声明 # coding=编码 # coding=utf-8 3.建议每行不 ...
- MySQL8——源码安装
一.环境 ubuntu18.10(CentOS7由于gcc版本过低已经无法通过编译) 二.准备工作 1.安装依赖 apt-get install -y gcc g++ cmake build-esse ...
- PHP后端代码生成微信小程序带参数的二维码保存成jpg图片上传到服务器getwxacodeunlimit
老板最近有点飘了,他要在PC端的网站放一个微信小程序的二维码,并且扫描这个二维码以后要跳到小程序对应的房源详情页. 这是微信官方给出的文档,连接地址:https://developers.weixin ...
- 新手学分布式 - Envoy Proxy XDS Server动态配置的一点使用心得
Envoy Proxy 动态API的使用总结 Envoy Proxy和其它L4/L7反向搭理工具最大的区别就是原生支持动态配置. 首先来看一下Envoy的大致架构 从上图可以简单理解:Listener ...
- C语言博客作业08
C语言I博客作业08](https://www.cnblogs.com/490-85-00-58-/p/11863312.html) 问题 回答 这个作业属于那个课程 C语言程序设计II 这个作业要求 ...
- 虚拟机中linux操作系统raid5(5块磁盘,3块做raid,2块做备份)配置流程及损坏磁盘的移除
1.打开所要用的虚拟机,点击编辑虚拟机设置,点击硬盘,添加 2.一直点击下一步不做修改,直到最后完成 3.按照以上步骤添加5块磁盘 4.点击开启虚拟机,输入用户名root密码登录进去 5.进入虚拟机后 ...
- Layui下拉3级联动
这里我就不给大家详细说明了直接附图: js代码: layui.use(['layer', 'form','xform','layer'], function () { var element = la ...