mysql 左表为null_mysql中,A表 left join B表时,B表可能为NULL,没有对应数据,又想要筛选数据怎么办...

1.直接上结论

办法:

sql语句中的筛选条件不要放在where中而是放在on条件中,否则数据会被where筛选掉(适当搭配聚合函数)。

2.场景复现

以下给个示例:

A表:

39206dbe4e46f76a9a023f82e7d63dd8.png

B表:

740ad1174247c11e343f1edeea93c455.png

如上图,两个表,分别记录student和各自喜欢的运行项目的表,结构简单,一目了然。

现在由于业务原因想要搜索出全班所有同学的感兴趣项目(没有的话也应该出现在结果的某行里,而不是不出现)。

即如下的展示形式:

e42ece6686531e21f0207f55eaf92835.png

那要怎么办呢?

3.思路演化

3.1 先查查试试看?

a8d26076df8cdf9478567a374c31b817.png

7369d85b09dda5ff34f910bad160e980.png

看出这两图的差别了吗?

第一个显然直接被排除,完全无法使用。

第二个好歹还接近些,估计改改就能满足需要了。

二者的主要区别就是:

前者的筛选条件放在where中,后者的放在on中,仔细体会下。

4.结合聚合函数改良

如果平常会用聚合函数的,大概都会想想办法,group_concat就很好。

4.1 3.1的延申

如下语句(注意这个是不满足要求的,放出来只是为了对比):

select

*

from

student s

LEFT JOIN

hobby h

on

s.id = h.student_id

where

h.name like '%跳%'

group by s.id;

展示结果:

44c60b57a5caf43edb526dca4524d93e.png

4.2 3.2的延申

1c11dea54378d11ce4c3a7a8977cec40.png

这不就是我们完美想要的样子吗?

把语句也贴出来:

select

s.*, group_concat(h.name)

from

student s

LEFT JOIN

hobby h

on

s.id = h.student_id

and

h.name like '%跳%'

group by s.id;

完美。

当然具体到业务还可以又其他灵活的用法,具体看情况。

好比查这样的主表副表关系,可以先通过group_concat把副表的id都得到,然后再分别得到副表的具体信息也可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值