如何显示不在某个MySQL表中的项目列表?此查询无效

时间:2016-08-01 20:08:05

标签: mysql

我有一系列课程(可以是开放或关闭)和一个用户列表(可以注册到一门或多门课程)。

我有三个表:usuarios(对于用户),cursos(对于课程)和cursosUsuarios(将两者联系起来以了解谁在哪里注册)。

我想显示一个特定用户(即UID 18)未注册的可用课程列表。

我正在尝试此查询,但这不起作用:

SELECT cursos.cursoID, cursos.nombreCurso, cursos.cursoFechaInicio, 
       cursos.modalidadCurso, cursos.estadoCurso,
       cursosUsuarios.userID, cursosUsuarios.cursoID
FROM cursos 
    LEFT JOIN cursosUsuarios ON cursos.cursoID = cursosUsuarios.cursoID
WHERE cursosUsuarios.userID NOT IN (
                                    SELECT cursosUsuarios.userID 
                                    FROM cursosUsuarios
                                   )
AND estadoCurso='abierto'
AND cursosUsuarios.userID = 18

这些是我的表格:

CREATE TABLE cursos (
    cursoID int unsigned not null auto_increment primary key,
    nombreCurso char(100) not null,
    cursoFechaInicio char(10) null,
    modalidadCurso char(50) not null,
    estadoCurso char(50) not null,
)

CREATE TABLE usuarios(
    userID int unsigned not null auto_increment primary key,
)

CREATE TABLE cursosUsuarios (
    cursosUsuariosID int unsigned not null auto_increment primary key,
    userID int not null,
    cursoID int not null
)

3 个答案:

答案 0 :(得分:0)

将该条件从WHERE移至JOIN ON子句,如

FROM cursos LEFT JOIN cursosUsuarios
ON cursos.cursoID = cursosUsuarios.cursoID
AND cursosUsuarios.userID <> 18
WHERE estadoCurso='abierto'

答案 1 :(得分:0)

我相信你的问题是LEFT JOIN。如果你把它变成INNER JOIN(例如,只是“JOIN”),那应该可以达到你想要的效果。

答案 2 :(得分:0)

这将返回所有'abierto'的课程,其中cursosUsuarios表中不存在userID 18和cursos,使用别名来清理一点。

SELECT c.cursoID, c.nombreCurso, c.cursoFechaInicio, c.modalidadCurso, c.estadoCurso, cu.userID, cu.cursoID
FROM cursos c
LEFT JOIN cursosUsuarios cu ON c.cursoID = cu.cursoID AND cu.userID = 18
WHERE cu.cursosUsuariosID is null
AND c.estadoCurso='abierto'