前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mysql左连接丢失null值的问题

mysql左连接丢失null值的问题

作者头像
全栈程序员站长
发布2022-08-23 13:11:15
2.8K0
发布2022-08-23 13:11:15
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

一、前言

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

博主之前遇到过这个问题,只不过当时解决了就没记录。谁知道前两天有朋友问到这个sqlnnd给忘记了,又耗费了大半个小时,这里还是记录下。

二、错误复现以及解决方案

1、右表不带筛选条件的查询

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

代码语言:javascript
复制
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

结果:

代码语言:javascript
复制
id		name			order_time
11		好愧开语音泼猴	1574341554
12		饸烙面			1574587287
9		黄焖鸡米饭		1574340342
NULL	黄焖鸡1			NULL

这里能看到,我们查询出来的有带有NULL值的列。

2、右表带有筛选条件

代码语言:javascript
复制
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

结果:

代码语言:javascript
复制
id		name			order_time
11		好愧开语音泼猴	1574341554
12		饸烙面			1574587287
9		黄焖鸡米饭		1574340342

根据结果发现,我们原来带有null值的列消失了,是的,是被where中的筛选条件给筛选掉了。只是有时候我们的需求是要获取所有的商品信息的,因此这个null列还不能被筛选掉,不然就造成数据缺失了。

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

3、左连接之后加筛选条件

代码语言:javascript
复制
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

结果:

代码语言:javascript
复制
id		name			order_time
11		好愧开语音泼猴	1574341554
12		饸烙面			1574587287
9		黄焖鸡米饭		1574340342
NULL	黄焖鸡1			NULL

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

end

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/137920.html原文链接:https://javaforall.c

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年5月6,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、前言
  • 二、错误复现以及解决方案
    • 1、右表不带筛选条件的查询
      • 2、右表带有筛选条件
        • 3、左连接之后加筛选条件
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档