从一个表中选择整体成绩,并在两个表之间进行连接

时间:2017-11-20 23:20:27

标签: mysql sql join

我正在尝试从2个表中选择列,如果它们使用相同的辅助键,则将它们添加到一起。这是我的表格:

assignments table
assID  modID   userID  assName  grade  weighting
1       1       1      ass1      70      25
2       1       1      ass2      65      75
3       2       1      ass3      71      50
4       2       1      ass4      74      50


modules table
modID  SOUD  modName  
1      2326  server side
2      2345  OOP

我想通过使用SUM(等级*(加权/ 100))并将具有相同modID的列的结果加在一起来查找每个模块的总成绩

我目前的代码是:

SELECT SOUD, ModuleName, SUM(Grade*(Weighting/100)) 
FROM `assignments`, `modules` 
GROUP BY assignments.ModuleID

我也试过

SELECT SOUD, ModuleName, SUM(Grade*(Weighting/100)) 
FROM `assignments`, `modules` 
GROUP BY assignments.ModuleID

但不起作用

我有什么方法可以做到这一点吗?

1 个答案:

答案 0 :(得分:1)

这是您的一个疑问:

SELECT SOUD
 , ModuleName
 , SUM(Grade * (Weighting / 100))
FROM `assignments`
 , `modules`
GROUP BY assignments.ModuleID

该语法的作用是多次使用assignments中的每一行以及modules中的每一行(这称为“笛卡尔积”)。所以要在from子句中使用逗号修复 STOP。

SELECT
   m.SOUD
 , m.ModuleName
 , SUM(a.Grade * (a.Weighting / 100))
FROM `assignments` a
INNER JOIN`modules` m ON a.modID = m.modID  
GROUP BY a.ModuleID

另请注意,当您连接表时,VITAL会在表名或表别名前面添加每个列引用。

另外一个警告,上面的查询“可能在MySQL中工作”,具体取决于服务器设置。 MySQL有一种非常奇怪和非标准的方式来处理group by所以如果你想要一个健壮的解决方案,总是将select子句的列(不使用聚合函数)包含在group by子句中,就像这样:

SELECT
   m.SOUD
 , m.ModuleName
 , SUM(a.Grade * (a.Weighting / 100))
FROM `assignments` a
INNER JOIN`modules` m ON a.modID = m.modID  
GROUP BY
   m.SOUD
 , m.ModuleName