mysql - 通过两个表之间的连接从一张表中选择总体成绩

标签 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       2       1      ass4      74      50


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

我想通过使用 SUM(Grade*(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

关于mysql - 通过两个表之间的连接从一张表中选择总体成绩,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47402746/

相关文章:

mysql - 解决方法 : make mysql column name longer than 64 chars

mysql - 将内部联接结果合并到一列

MySQL 显示一行以不同的值多次出现?

php - 从派生表中提取列并将它们汇总到一个 MySQL SELECT 语句中

mysql - linux 中用于处理数据库(oracle、mysql)的最佳 Gui 编辑器?

java - 将 Java 日志记录与 mySQL 结合起来

mysql - 执行数据库查询时出错

sql - 对具有不同 ID 的两行求和

mysql - Having 子句不适用于 MySQL 中的连接

mysql - OUTER JOIN 和 FULL OUTER JOIN 最简单的实现?