我有一系列课程(可以是开放或关闭)和一个用户列表(可以注册到一门或多门课程)。
我有三个表: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
)
答案 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'