计算不同表格的平均值

时间:2013-07-10 20:11:09

标签: php mysql sql database

对于一个很长的问题,我很抱歉,只是想详细解释一下。我的格式不是很好,也很抱歉。我有一个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);
 }
}

//生物学 等

我将表拆分为单独的表,并在单独的表中使用名称,不需要计算空间,因此我不会在此处显示。每个主题表都采用以下形式:

id date exam_no term year grade class test*

*测试将是eng_mid或eng_end或mat_mid等。

因为我只有一个返回10行的查询(5个主题,每个包含两个测试:例如eng_mid(英语Mit考试),eng_end(英语结束测试),我能够在一个调用中捕获所有行并打包将每个主题放入一个数组中,然后在array_map的帮助下计算出平均类。它可能不是很优雅,但它运行得很好。现在,我在每个测试都在自己的表中。

我试图编写一个关节以获得一个signle结果集,但查询失败了。列如下:

我知道数据库设计并不值得骄傲,但是来自一张巨大的单桌,这是一个巨大的进步(值得一拍)。

我希望能够查询我的所有数据并计算班级平均值(每班约30名学生)。我试图使用单独的查询,但我遇到了一个墙,以前我会使用WHILE条件,如查询后显示它拉取所有行并创建一个数组,我可以从中获得所需的结果。现在有几个问题让我很困惑,因为连接不起作用,我怎么能得到相同的结果。此外,我有一个单独的$ row变量,这让我进一步失去平衡!

甚至可以像我在臭名昭着的一张桌子上做的那样(从黑暗的一面)做平均值,或者我的桌面设计如此混乱,我想要的只是人性化不可能?

请任何帮助将深表感谢。

1 个答案:

答案 0 :(得分:0)

尝试使用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表将存储您拥有的各种主题(此时将只有五个:math,eng,phy等。

平均查询将非常简单(是的,您实际上可以在查询中执行aggregation

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