如何在MySQL中选择排除多对多关系表中特定项ID的列表?

时间:2016-10-25 03:27:32

标签: mysql

我有一个名为cursos的MySQL表中可用的课程列表。 我在一张名为usuarios的表格中列出了所有学生的名单。 要知道哪个用户注册了哪个课程(这是一个多对多的关系),我有一个cursosUsuarios表。

我想向用户显示所有可用课程的列表,供他/她选择要注册的新课程。但我不想在该列表中显示用户已注册的课程。

所以,我想到了这一点,例如,显示用户UID 1不在的所有可用课程:

SELECT DISTINCT cursos.cursoID, cursos.nombreCurso
FROM cursos LEFT JOIN cursosUsuarios
ON cursos.cursoID = cursosUsuarios.cursoID
WHERE cursosUsuarios.userID != 1
GROUP BY cursosUsuarios.cursoID 

这是预期的结果: User 1属于Curso D(ID.8),因此,列表不应显示Curso D

cursos.cursoID ---------- cursos.nombreCurso
5 -------------------------- Curso A
6 -------------------------- Curso B
7 -------------------------- Curso C

但是列表显示了每一门课程(甚至是Curso D),因为还有其他学生注册了该课程,因此,在表格中,curso D ID也出现在其他行中,即使用户ID 1不在那里。

这就是我在cursosUsuarios中所得到的:

cursosUsuarios.cursoID ---------- cursosUsuarios.userID
8 ------------------------------------ 1
6 ------------------------------------ 2
7 ------------------------------------ 4
8 ------------------------------------ 3
6 ------------------------------------ 5
5 ------------------------------------ 2

因此,curso D(id.8)除了用户ID 1之外还有其他用户注册,因此,这就是它出现在列表中的原因,因为用户ID为3的行。

我该如何解决?

1 个答案:

答案 0 :(得分:0)

我刚刚找到了解决方案,以防万一它可以帮助某人:

我只需要进行子选择查询,其中第二个查询显示注册用户ID为1的所有课程,然后,第一个选择查询包含WHERE子句:

SELECT DISTINCT cursos.cursoID, cursos.nombreCurso
FROM cursos LEFT JOIN cursosUsuarios
ON cursos.cursoID = cursosUsuarios.cursoID

WHERE cursos.cursoID 
NOT IN (SELECT cursoID from cursosUsuarios WHERE userID = 1)