计算不同表的平均值


Computing an average from different tables

我很抱歉有一个很长的问题,只是想详细解释一下。我的格式不太好,也很抱歉。我有一个PHP/MySQL应用程序,它本质上不是真正的关系型应用程序,因为我有一张大表来显示所有学生的分数。除其他外,我能够计算出每门科目的平均成绩,这样平均成绩就会与学生的成绩一起出现。现在,我已经将表格拆分为多个表格,并像以前一样成功地查询和创建了学校成绩单。困难在于,我再也无法计算任何科目的可用性了。

由于我有一张5名受试者的表格,每个受试者都有2次测试,我查询数据并计算平均值如下:

一个表(列):

id date name exam_no term term year eng_mid eng_end mat_mid mat_end phy_mid phy_end bio_mid bio_end che_mid che_end

唯一的查询:

 $query = "SELECT * FROM pupils_records2 
 WHERE grade='$grade' && class='$class' && year =  '$year' && term ='$term'";
 $result = mysqli_query($dbc, $query);
if (mysqli_num_rows($result) > 0) {
$num_rows=mysqli_num_rows($result);
while($row = mysqli_fetch_array($result)){
//English
$eng_pupils1{$row['fname']} = $row['eng_mid'];
$eng_pupils2{$row['fname']} = $row['eng_end'];
$mid=(array_values($eng_pupils1));
$end=(array_values($eng_pupils2));
$add = function($a, $b) { return $a + $b;};
$eng_total = array_map($add, $mid, $end);
foreach ($eng_total as $key => $value){
 if ($value==''){
 unset ($eng_total[$key]);
 }
}
$eng_no=count($eng_total);
$eng_ave=array_sum($eng_total)/$eng_no;
$eng_ave=round($eng_ave,1);

//数学

$mat_pupils1{$row['fname']} = $row['mat_mid'];
$mat_pupils2{$row['fname']} = $row['mat_end'];
$mid=(array_values($mat_pupils1));
$end=(array_values($mat_pupils2));
$add = function($a, $b) { return $a + $b;};
$mat_total = array_map($add, $mid, $end);
foreach ($mat_total as $key => $value){
 if ($value==''){
 unset ($mat_total[$key]);
 }
}
print_r($mat_total);
$mat_no=count($mat_total);
echo '<br />';
print_r($mat_no);
$mat_ave=array_sum($mat_total)/$mat_no;
$mat_ave=round($mat_ave,1);
 }
}

//生物学etc

我将表拆分为单独的表,并在单独的表中有名称,计算可用性不需要,所以我不会在这里显示它。每个主题表采用以下形式:

id date exam_no term year grade class test*

*测试将是eng_mid或eng_end或mat_mid等

因为我只有一个查询返回了10行(5个科目,每个科目有两个测试:例如eng_mid(英语Mit考试)、eng_end(英语期末测试),所以我能够在一个调用中捕获所有行,并将每个科目打包到一个数组中,然后在array_map的帮助下计算出类平均值。它可能不优雅,但效果很好。现在,我把每个测试都放在自己的表中。

我正试图编写一个联合,以便获得一个可签名的结果集,但查询失败了。列如下:

我知道数据库设计并不是什么值得骄傲的事情,但来自一个巨大的单表,这是一个重大的步骤(值得一拍)。

我想做的是能够查询我的所有数据并计算班级平均值(每个班级大约有30名学生)。我尝试使用单独的查询,但遇到了麻烦,因为之前我会使用查询后显示的WHILE条件来拉取所有行,并创建一个数组,从中我可以获得所需的结果。现在有几个查询让我很困惑,因为联接不起作用,我不知道如何归档相同的结果。此外,我还有一个单独的$row变量,这让我更加失衡!

有没有可能像我在臭名昭著的一张桌子上那样(从黑暗的一面)做平均值,或者我的桌子设计太糟糕了,我想要的东西根本不可能实现

请提供任何帮助,我们将不胜感激。

尝试使用union。它会有点像

select grade, test from math
union all
select grade, test from english
union all
....

此外,在我看来,更好的设计是让表exams像这样(警告,伪DML):

id int primary key,
student_id int foreign key students
subject_id int foreign key subjects
exam_type_id int foreign key exam_types 
grade int(????)
  • exam_types表只是中期和最终的,但如果需要的话,您将来可以轻松地支持更多类型
  • subjects表格将存储您拥有的所有科目(此时只有五门:数学、英语、物理等)

平均查询将像一样简单(是的,您实际上可以在查询本身中进行聚合)

select student_id, avg(grade)
from exams
group by student_id