背景: 一(表A:course_info 课程表)对多(表B:class_info班级表)的关系,想以A表为基准,查出符合条件的对应的多条记录。查出课程被删掉的,且其对应的“默认班级”(couse_info.deleted = 1 and class_info.name = ‘默认班级’)
假想: 最开始是想在where或者having中做筛选,但是因为并列的筛选条件有很多,不应该做统一的筛选;决定把筛选条件拿到 select 的if中,并对符合条件的项目进行拼接。
方案一:
select
ci.course_name,
ci.deleted,
GROUP_CONCAT(if( ci.deleted = 1 and cl.class_name = '默认班级', cl.class_name, null))
from
course_info ci,
class_info cl,
course_class cc
where
ci.course_id = cc.course_id
and cl.class_id = cc.class_id
group by ci.id;
查询结果:
方案二:
select
ci.course_name,
ci.deleted,
if( ci.deleted = 1 and cl.class_name = '默认班级', GROUP_CONCAT(cl.class_name), 0)
from
course_info ci,
class_info cl,
course_class cc
where
ci.course_id = cc.course_id
and cl.class_id = cc.class_id
group by ci.id;
查询结果:
可见方案一是对的。方案一:仅仅显示分组后符合条件的结果;方案二:分组后,组内有符合条件的结果就行,然后全部显示。