如何对这三个表进行适当的 OUTER JOIN?我不断得到最后一栏中的所有结果,加起来

How to do a proper OUTER JOIN with these three tables? I keep getting all results in the last column, added up

我有三个表: usuarios(用户) cursosUsuarios(每个用户在课程中的注册) pagos(付款)

我想列出给定课程中的所有用户,并将付款相加。对于还没有付费的用户,他们应该还会出现在列表中。

这些是我的表格:

CREATE TABLE usuarios(
    userID int unsigned not null auto_increment primary key,
    userEmail char(50) null
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE cursosUsuarios (
    cursosUsuariosID int unsigned not null auto_increment primary key,
    userID int not null,
    cursoID int not null DEFAULT '0'
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE pagos (
    pagoID int unsigned not null auto_increment primary key,
    userID int not null,
    cursoID int null,
    pagoMonto int null COMMENT 'aumont of money paid'
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

这是我的查询:

                       SELECT    
                          usuarios.userID AS userid, 
                          SUM(pagos.pagoMonto) AS total

                        FROM usuarios 
                        RIGHT JOIN cursosUsuarios
                        ON usuarios.userID = cursosUsuarios.userID

                        LEFT JOIN pagos
                        ON pagos.cursoID = cursosUsuarios.cursoID

                        WHERE cursosUsuarios.cursoID = 90
                        GROUP BY usuarios.userID, pagos.cursoID
                        ORDER BY usuarios.userID DESC

预期结果是:

userid  total   
1   500
2   NULL
3   200
4   100
5   400
6   NULL
7   NULL
8   NULL
9   NULL
10   NULL

我得到的结果是:

userid  total   
1   1200
3   1200
4   1200
5   1200

我做错了什么?谢谢!

我需要看看您的 table 是如何放置的,以获得更准确的结果。因为我不知道这些值是如何排列的,所以我假设您想根据 pagos table 下的每个用户 ID 求和。

我也不明白为什么你有一个 RIGHT JOIN 然后一个 LEFT 到 tables。我假设您总是希望 ID 匹配,而不仅仅是存储在 CurosUsuarios 上的内容。随意调整您的 JOINS。

           SELECT    
                 usuarios.userID AS userid,
                 pagos1.total 
                 FROM usuarios
             LEFT JOIN cursosUsuarios ON usuarios.userID = cursosUsuarios.userID
             LEFT JOIN  (
                      SELECT SUM(pagos.pagoMonto) AS total,
                          pagos.cursoID,
                          pagos.userID
                       FROM pagos
                      WHERE pagos.cursoID = ?
                      GROUP BY userID
                    ) pagos1 ON pagos1.userID = cursosUsuarios.userID
        WHERE cursosUsuarios.cursoID = ?
        ORDER BY usuarios.userApellido ASC