Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 从一个表中选择两个表之间连接的总体等级_Mysql_Sql_Join - Fatal编程技术网

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

是的,我知道了,我怎么修理它,汉克斯!!你是天才,请学习如何正确连接表。表名之间的逗号是危险的,你应该像瘟疫一样避免它们!您可能会发现这一点很有帮助:请注意,可以选择向上投票和“接受”答案。