对于一个很长的问题,我很抱歉,只是想详细解释一下。我的格式不是很好,也很抱歉。我有一个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变量,这让我进一步失去平衡!
甚至可以像我在臭名昭着的一张桌子上做的那样(从黑暗的一面)做平均值,或者我的桌面设计如此混乱,我想要的只是人性化不可能?
请任何帮助将深表感谢。
答案 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