mysql中,A表leftjoinB表时,B表可能为NULL,没有对应数据,⼜想要筛选数
据怎么办
1.直接上结论
办法:
sql语句中的筛选条件不要放在where中⽽是放在on条件中,否则数据会被where筛选掉(适当搭配聚合函数)。
2.场景复现
以下给个⽰例:
A表:
B表:
如上图,两个表,分别记录student和各⾃喜欢的运⾏项⽬的表,结构简单,⼀⽬了然。
现在由于业务原因想要搜索出全班所有同学的感兴趣项⽬(没有的话也应该出现在结果的某⾏⾥,⽽不是不出现)。
即如下的展⽰形式:
那要怎么办呢?
3.思路演化
3.1 先查查试试看?
看出这两图的差别了吗?
第⼀个显然直接被排除,完全⽆法使⽤。
第⼆个好⽍还接近些,估计改改就能满⾜需要了。
⼆者的主要区别就是:
前者的筛选条件放在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;
展⽰结果:
4.2 3.2的延申
这不就是我们完美想要的样⼦吗?
把语句也贴出来:
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;
完美。
当然具体到业务还可以⼜其他灵活的⽤法,具体看情况。
mysql下载不了怎么办好⽐查这样的主表副表关系,可以先通过group_concat把副表的id都得到,然后再分别得到副表的具体信息也可。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论