mysql - SQL 多个 JOINS 中的 SUMS 不正确

标签 mysql database

我正在尝试使用 MySQL 中的联接和求和来对多个表求和,但没有取得太大成功。

我的表格(删除了不必要的列)

学生

idStudent   studentname   studentyear
1           foobar        11
2           barfoo        11
3           thing         8

Athletics_Results

idResult   idStudent   points
1          1           14
2          1           11
3          3           7
4          2           9

团队结果

idTeamResults   year   points
1               11     9
2               8      8
3               7      14

所以让我解释一下这些表格,因为我承认它们的命名和设计都很糟糕。

学生拥有每个学生的基本信息,包括他们的年级和姓名。每个学生都有一个唯一的 ID。

Athletics_Results 存储田径赛事的结果。 idStudent 列是外键,与学生列中的 idStudent 相关。因此,学生 foobar (idStudent 1) 在示例中获得了 14 分和 11 分。

Team_Results 存储多个学生参加的事件的结果。它只存储年级组和分数。

目标

我希望能够得出每年的分数总和 - 结合了 sports_results 和 team_results。例如:

year   points
7      14     <-- No results in a_r, just 14 points in t_r
8      15     <-- 7 points in a_r (idResult 4) and 8 in t_r
11     43     <-- 14, 11, 9 points in a_r and 9 in t_r

我尝试过的 出于测试目的,我还没有尝试将 a_r 分数和 t_r 分数组合起来,而是将它们保留为两列,以便我可以看到发生了什么。

我尝试的第一个查询:

SELECT students.studentyear as syear, SUM(athletics_results.points) as score, SUM(team_results.points) as team_score
FROM students
JOIN team_results ON students.studentyear = team_results.year
JOIN athletics_results ON students.idStudent = athletics_results.idStudent
GROUP BY syear;

这为每年提供了不同的行(根据需要),但 SUMS 不正确。我了解到这是由于未对连接进行分组所致。

然后我创建了这段代码:

SELECT studentyear as sYear, teamPoints, AthleticsPoints
FROM students st

JOIN    (SELECT year, SUM(tm.points) as teamPoints
        FROM team_results tm
        GROUP BY year) tr ON st.studentyear = tr.year 

JOIN    (SELECT idStudent, SUM(atr.points) as AthleticsPoints
        FROM athletics_results atr
        ) ar ON st.idStudent = ar.idStudent

它给出了正确的 SUMS,但只返回了一年组行(例如 11 年级的分数)。

编辑 - SQLFiddle 在这里:http://sqlfiddle.com/#!9/dbc16/ 。这是我的实际测试数据,比我在这里发布的数据样本更大。

最佳答案

http://sqlfiddle.com/#!9/ad111/7

SELECT tr.`year`,  COALESCE(tr.points,0)+COALESCE(SUM(ar.points),0)
FROM Team_Results tr
LEFT JOIN Students s
ON tr.`year`=s.studentyear
LEFT JOIN Athletics_Results ar
ON s.idStudent = ar.idStudent
GROUP BY tr.year

根据您提供的评论和 fiddle 检查http://sqlfiddle.com/#!9/dbc16/3

SELECT tr.`year`,  COALESCE(tr.points,0)+COALESCE(SUM(ar.points),0)
FROM (
  SELECT `year`, SUM(points) as points
  FROM Team_Results
  GROUP BY `year`) tr
LEFT JOIN Students s
ON tr.`year`=s.studentyear
LEFT JOIN Athletics_Results ar
ON s.idStudent = ar.idStudent
GROUP BY tr.year

关于mysql - SQL 多个 JOINS 中的 SUMS 不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29722132/

相关文章:

python - 使用 python 将值插入表中

php - 如何从PHP中的数据库中获取时间总和?

mysql 在具有 1 亿行的表上创建索引

mysql - 一个条目中有多个值

php - 将所有表格的单元格值更改为零

mysql - Doctrine/MySQL性能: 470 columns in one table

mysql - 连接两个表,从两个表中选择值,第二个表没有记录

mysql - SUM 时间值 MySQL

database - 有没有办法获取 SQLITE 中 View 的列数据类型?

mysql - 显示来自两个外键的列数据