我正在尝试从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
但不起作用
我有什么方法可以做到这一点吗?
答案 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