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;
完美。
当然具体到业务还可以又其他灵活的用法,具体看情况。
好比查这样的主表副表关系,可以先通过group_concat把副表的id都得到,然后再分别得到副表的具体信息也可。