如何对这三个表进行适当的 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
我有三个表: 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