2016-07-26 11 views
0

私は4つのMySQLのテーブルがあります。MYSQL SELECTクエリ:4つのテーブルをAND条件とOR条件で連結する方法は?

usuarios(すべてのユーザのリストとその個人情報を持っている)

役割を(彼らの許可を決定し、サイトで使用可能なロールのリストを持っています)

rolesUsuarios(リンク役割を持つ各ユーザー。彼らは複数を持つことができます)

cursosは私がすることを示しているSELECTクエリを作りたい

cursosUsuarios(リンク彼らが登録されているすべてのコースで、各ユーザー)

(各コースの説明とサイトのコースのリストを持っています)特定のユーザーのための私の個人情報、すべての個人情報、彼が持っている役割、彼が登録しているコース。

私はありません。このクエリを作成した作業:

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 
); 
+0

あなたは 'inner'ジョインに相当することをしています - レコードは結合の両側のテーブルに存在しなければなりません。代わりに 'left'または' right'結合が必要です。適切な 'select table1 join table2 join table3'型構文を使用して、結合タイプの指定を容易にします。 –

+0

私はちょうどそのような複雑なSELECT(少なくとも私に複雑な)でそれを変更する方法を理解していない – Rosamunda

答えて

1

私はこのような何かがうまくいくと思う:あなたはWHERE句で、単一のユーザーIDを選択している場合

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; 

はまた、必要はありませんGROUP BY userID行の場合

関連する問題