Mysql 从一个表中选择两个表之间连接的总体等级
我试图从两个表中选择列,如果它们使用相同的辅助键,则将它们添加到一起。这是我的桌子:Mysql 从一个表中选择两个表之间连接的总体等级,mysql,sql,join,Mysql,Sql,Join,我试图从两个表中选择列,如果它们使用相同的辅助键,则将它们添加到一起。这是我的桌子: 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
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
我想通过使用SUMGrade*Weighting/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
但两者都不起作用
有什么办法可以做到这一点吗?这是您的问题之一:
SELECT SOUD
, ModuleName
, SUM(Grade * (Weighting / 100))
FROM `assignments`
, `modules`
GROUP BY assignments.ModuleID
这种语法的作用是将赋值中的每一行与模块中的每一行相乘,这称为笛卡尔积。因此,要解决此问题,请停止在from子句中使用逗号
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
另外请注意,在联接表时,必须在每个列引用前加上表名或表别名的前缀
还有一个警告,上面的查询可能在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
是的,我知道了,我怎么修理它,汉克斯!!你是天才,请学习如何正确连接表。表名之间的逗号是危险的,你应该像瘟疫一样避免它们!您可能会发现这一点很有帮助:请注意,可以选择向上投票和“接受”答案。