如何实现查询所有记录,排除meeting_status.teacher_id不等于指定教师的条目?
如何编写排除特定教师关联会议的SQL查询?
首先得明确你的核心需求:你想要获取所有meeting表的记录,但要排除那些在meeting_status表里被非指定教师关联过的会议。这里分两种常见场景,我分别给你对应的写法:
场景1:保留「无状态记录」或「状态记录属于指定教师」的会议
如果你的需求是:只要会议没有对应的状态记录,或者状态记录里的教师是你指定的那个,就保留这条会议记录——那可以用LEFT JOIN配合WHERE条件实现:
-- 把28换成你实际要指定的teacher_id SELECT m.* FROM meeting m LEFT JOIN meeting_status ms ON m.id = ms.meeting_id WHERE ms.teacher_id IS NULL OR ms.teacher_id = 28;
逻辑解释:
LEFT JOIN会保留所有meeting表的记录,不管有没有对应的meeting_status数据ms.teacher_id IS NULL:匹配那些还没有任何状态记录的会议ms.teacher_id = 28:匹配状态记录属于指定教师的会议- 两个条件用
OR连接,就自动排除了那些有状态记录但教师不是指定值的会议
场景2:排除所有「存在非指定教师关联状态」的会议
如果你的需求更严格:只要某条会议存在任意一条状态记录是其他教师的,就直接排除整个会议(哪怕它同时也有指定教师的状态记录)——那用NOT EXISTS子查询更合适:
-- 把28换成你实际要指定的teacher_id SELECT m.* FROM meeting m WHERE NOT EXISTS ( SELECT 1 FROM meeting_status ms WHERE ms.meeting_id = m.id AND ms.teacher_id != 28 );
逻辑解释:
- 子查询会检查当前会议是否存在非指定教师的状态记录
NOT EXISTS会过滤掉所有存在这种记录的会议,剩下的就是:要么没有任何状态记录,要么所有状态记录都属于指定教师的会议
你可以根据自己的实际业务需求选择对应的写法~
内容的提问来源于stack exchange,提问作者Captaîn Aamusane
相关产品推荐
相关产品推荐

