首页 > 解决方案 > 将 NOT IN 转换为 WHERE 加入

问题描述

我正在尝试获取与某个成员无关的所有记录,注册是一个交叉实体,可以解决成员到课程的多对多问题。

SELECT * FROM lesson
INNER JOIN training
ON training.id = lesson.training_id
WHERE lesson.id
NOT IN (SELECT registration.lesson_id FROM registration WHERE registration.member_id = 42)

我一直在尝试将此代码转换为使用 join 语句,但我无法让它工作。

SELECT  l.*
FROM    t_left l
LEFT JOIN
t_right r
ON      r.value = l.value
WHERE   r.value IS NULL

这种技术不起作用,因为这会返回根本没有任何关系的课程记录,我需要它来查看它是否与特定成员没有关系。

实体关系模型

标签: mysqlsql

解决方案


你想把你的NOT IN变成反加入吗?为什么?我发现NOT IN更具可读性。

反正:

SELECT * 
FROM lesson l
INNER JOIN training t ON t.id = l.training_id
LEFT JOIN registration r ON r.lesson_id = l.id AND r.member_id = 42
WHERE r.id IS NULL;

推荐阅读