首页 > 数据库 >MySQL左连接丢失null值的问题

MySQL左连接丢失null值的问题

时间:2023-12-14 11:15:23浏览次数:45  
标签:name time order 丢失 MySQL 筛选 null id

一、前言
我们有的时候直接使用左连接查询,当右表不存在该数据的时候,是可以查出带有null的列。可是当在where条件中有右表相关的筛选条件时,我们惊奇的发现查询的结果不带null值了,换句话说就是查出来的结果比预期的少。

二、错误复现以及解决方案
1、右表不带筛选条件的查询

sql相关的表主要是w_order(订单表)和w_a_info(商品种类表):

 SELECT
  o.id ,
 a.name,
 o.order_time
FROM
 w_a_info AS a
  left JOIN w_order AS o ON a.id = o.infoid
WHERE
  a.ifshow = 200
GROUP BY
 a.id

id		name			order_time
11		好愧开语音泼猴	1574341554
12		饸烙面			1574587287
9		黄焖鸡米饭		1574340342
NULL	黄焖鸡1			NULL

2、右表带有筛选条件

SELECT
  o.id ,
 a.name,o.order_time
FROM
 w_a_info AS a
  left JOIN w_order AS o ON a.id = o.infoid
WHERE
  a.ifshow = 200
  and o.order_time>0
GROUP BY
 a.id

id		name			order_time
11		好愧开语音泼猴	1574341554
12		饸烙面			1574587287
9		黄焖鸡米饭		1574340342
  根据结果发现,我们原来带有null值的列消失了,是的,是被where中的筛选条件给筛选掉了。只是有时候我们的需求是要获取所有的商品信息的,因此这个null列还不能被筛选掉,不然就造成数据缺失了。

  这里推测是因为sql的执行顺序,on表连接是先于where条件的,因此我们先on连接之后,产生了不符合条件的NULL列,然后NULL列被where条件给筛选掉了。这里解决方案是把右表的筛选条件放到前面去,也就是连表的地方去。

3、解决方式 左连接之后加筛选条件

SELECT
  o.id ,
 a.name,
 o.order_time
FROM
 w_a_info AS a
  left JOIN w_order AS o ON a.id = o.infoid AND o.order_time>0
WHERE
  a.ifshow = 200
GROUP BY
 a.id

id		name			order_time
11		好愧开语音泼猴	1574341554
12		饸烙面			1574587287
9		黄焖鸡米饭		1574340342
NULL	黄焖鸡1			NULL

这里我们把筛选条件放到连接处,通过on ... and ... 的方式,在连接时就附带上条件,此时不符合条件的数据列还是以null值的方式展现,并不会被后续的where筛选条件给筛选掉。

原创地址:https://blog.csdn.net/ID_LiSheng/article/details/132149821

标签:name,time,order,丢失,MySQL,筛选,null,id
From: https://www.cnblogs.com/miyiyangdexin/p/17900742.html

相关文章

  • 解决Ubuntu系统在Vmware中重启后丢失网络图标和服务的问题
    问题如上。解决方法:先关掉NetworkManager:sudoserviceNetworkManagerstop用gedit打开NetworkManager.statesudogedit/var/lib/NetworkManager/NetworkManager.state改成如下:重启NetworkManager:sudoserviceNetworkManagerrestart完成注意:不同版本的U......
  • 解决mysql的语句中group_concat长度限制问题
    在mysql中,有个函数叫“group_concat”,平常使用可能发现不了问题,在处理大数据的时候,会发现内容被截取了。其实MYSQL内部对这个是有设置的,默认不设置的长度是1024。查看默认配置showvariableslike"group_concat_max_len";模板返回是Variable_nameValuegroup_co......
  • 数据库选型:MySQL、PostgreSQL、MongoDB
    能够支撑实时业务的数据库,常见的数据库有:关系型数据库:MySQL、PostgreSQL,以及Oracle、DB2、MicrosoftSQLServer等非关系型数据库:MongoDB下面针对MySQL、PostgreSQL、MongoDB做对比分析。关于最受欢迎排行榜,该三类数据库处于前五位置,也是霸榜颇久。另外补充数据库市场份额如下......
  • excel_to_mysql过程(Excel数据转换到MySQL数据库当中)
    准备数据流图:在输入输出里面找到对应的类型:数据流图建好了接下来怎么将excel表格数据抽取到mysql当中去???####编辑excel输入:手机号改为数字类型,就没有.0了,主要是类型问题@@@@@@@@@@@@@@@@@@@@@@@建立mysqll连接,进行编辑表输出最后看一下原始数据:22个单元格,21条数据,和以上数据相符!!......
  • MySQL ERROR:Access denied for user `root`@`localhost` (using password:YES)
    背景  使用docker安装mysql5.7,容器显示正常启动,但始终本地或者远程都连接不上该数据库 定位原因  密码加密方式错误 解决方法   参考链接【1】https://www.cnblogs.com/beanmoon/p/3173924.html......
  • MySQL Update语句一个非常经典的“坑”
    起因最近好几次有开发同学在钉钉上问我,比如下图: 问题归纳起来就是:在MySQL里面update一条记录,语法都正确的,但记录并没有被更新…结论小结:在一条UPDATE语句中,如果要更新多个字段,字段间不能使用“AND”,而应该用逗号分隔。现象刚遇到这个问题的时候,我拿到这条语句直接在测试......
  • 【SpringBootWeb入门-12】MySQL-DDL-图形化工具
    1、章节前言上一篇文章我们讲解了MySQL的安装与配置,以及相关sql命令的执行操作,在演示这些sql语句的时候,我们都是在命令行当中进行操作的,在命令行当中敲写语句很不方便,主要原因有以下几点:无提示:命令行当中输入任何sql语句没有任何提示,全凭记忆,而且很容易敲错代码;操作繁琐:全部的......
  • mysql审计之插件MariaDB Audit Plugin
    一、概述审计插件是包含在MariaDB中的,所以需要先下载MariaDB然后将server_audit.so审计插件copy出来。MariaDB的10.1版本对应与Oracle的MySQL5.7版本,这里是MariaDB官方下载地址可以从链接里下载MariaDB我做实验使用的版本是8.0.25MariaDB并不兼容mysql5.7......
  • GO TCP代理(可代理SQLSERVER\MYSQL\ORCALE)
    用nginx代理不知道为什么内网能用,外网用不了,改用go写个代理临时用下,直接上代码 packagemainimport( "fmt" "io" "log" "net")varaddrstring="0.0.0.0:51415"//代理服务端口vardest_addrstring="192.168.2.120:1433"//目标地址......
  • MySQL和sqlite的区别
    存储方式MySQL:是一个服务器端的数据库系统,通常运行在一个独立的服务器上。数据存储在服务器的硬盘上。SQLite:是一个嵌入式数据库,通常用于移动应用和桌面应用。数据存储在一个单一的文件中。并发支持MySQL:支持高并发,适用于大型、多用户的应用。SQLite:并发支持较弱,更适用于......