MYSQL SELECT查询:如何使用AND和OR条件连接4个表?

时间:2016-07-26 17:11:33

标签: mysql

我有四个MySQL表:

usuarios (列出所有用户及其个人信息)

角色(拥有网站中可用角色的列表,确定其权限)

rolesUsuarios (将每个用户与其角色相关联。他们可以拥有多个用户)

cursos (包含每个课程描述的网站课程列表)

cursosUsuarios (将每个用户与他们注册的所有课程相关联)

我想制作一个SELECT查询,向我展示特定用户,他们的所有个人信息,他所拥有的角色以及他注册的课程。

我创建了这个有效的查询:

SELECT  usuarios.userID, usuarios.userEmail, usuarios.userApellido, usuarios.userNombres, 
                    usuarios.userDNI, usuarios.userFechaGeneracion,
                    rolesUsuarios.userID, rolesUsuarios.nombreRol,
                    cursosUsuarios.userID, cursosUsuarios.cursoID, 
                    cursos.cursoID, cursos.nombreCurso, cursos.cursoYear, cursos.cursoMes, 
                    cursos.modalidadCurso,
            GROUP_CONCAT(cursos.nombreCurso, ':', cursosUsuarios.cursoID ORDER BY cursosUsuarios.cursoID SEPARATOR ',') AS 'cursos'
            FROM usuarios JOIN rolesUsuarios JOIN cursosUsuarios JOIN cursos
            WHERE usuarios.userID='10'
            AND rolesUsuarios.userID = usuarios.userID
            AND cursosUsuarios.userID = usuarios.userID
            AND cursosUsuarios.cursoID = cursos.cursoID
            GROUP BY usuarios.userID

问题是,如果用户未注册任何课程,则不会显示任何结果。我该怎么办?

这些是每个表结构:

CREATE TABLE roles(
    roleID int unsigned not null auto_increment primary key,
    nombreRol char(50) not null
);

CREATE TABLE usuarios(
    userID int unsigned not null auto_increment primary key,
    userEmail char(50) null,
    userApellido char(50) null,
    userNombres char(50) null,
    userDNI int(10) null,
    userPass char(65) null,
    userFechaGeneracion char(10) null
);

CREATE TABLE rolesUsuarios (
    rolesUsuariosID int unsigned not null auto_increment primary key,
    userID int not null,
    nombreRol char(50) not null
);

CREATE TABLE cursos (
    cursoID int unsigned not null auto_increment primary key,
    nombreCurso char(100) not null,
    cursoYear int(4) not null,
    cursoMes char(3) not null,
    cursoFechaInicio char(10) null,
    modalidadCurso char(50) not null
);

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

1 个答案:

答案 0 :(得分:1)

我觉得这样的事情会奏效:

SELECT  usuarios.userID, usuarios.userEmail, usuarios.userApellido, usuarios.userNombres, 
                usuarios.userDNI, usuarios.userFechaGeneracion,
                rolesUsuarios.userID, rolesUsuarios.nombreRol,
                cursosUsuarios.userID, cursosUsuarios.cursoID, 
                cursos.cursoID, cursos.nombreCurso, cursos.cursoYear, cursos.cursoMes, 
                cursos.modalidadCurso,
GROUP_CONCAT(cursos.nombreCurso, ':', cursosUsuarios.cursoID ORDER BY cursosUsuarios.cursoID SEPARATOR ',') AS 'cursos'
FROM usuarios LEFT JOIN rolesUsuarios
    ON usuarios.userID = rolesUsuarios.userID
LEFT JOIN cursosUsuarios 
    ON usuarios.userID = cursosUsuarios.userID
LEFT JOIN cursos
    ON cursosUsuarios.cursoID = cursos.cursoID
WHERE usuarios.userID='10'
GROUP BY usuarios.userID;

此外,如果您在WHERE子句中选择单个userID,则不需要GROUP BY userID行。