詳細を説明しようとして、非常に長い質問で申し訳ありません。私のフォーマットはあまり良くありません、それも申し訳ありません。私は、すべての学生のスコアに対して 1 つの大きなテーブルを持っていたため、本質的に真のリレーショナルではない PHP/MySQL アプリケーションを持っていました。とりわけ、各科目の平均点を計算して、平均値が学生の点数と一緒に表示されるようにすることができました。今、テーブルを分割して、以前と同じように学校のレポートカードのクエリと作成に成功しているテーブルをいくつか用意しました。難点は、どの科目でも平均値を計算できなくなったことです。
5 人の被験者を含む 1 つのテーブルがあり、各被験者に 2 つのテストがあったため、データをクエリして、次のように平均を計算しました。
1 つのテーブル (列):
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
1 つのクエリ:
$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 行を返すクエリが 1 つしかなかったため (それぞれ 5 つの科目と 2 つのテスト: eng_mid (英語の Mit 試験)、eng_end (英語の期末試験) など)、1 回の呼び出しですべての行をキャプチャし、各科目を配列を作成し、array_map を使用してクラスの平均を計算します. 洗練されていないかもしれませんが、非常にうまく機能しました. 今では、それぞれのテストを独自のテーブルに持っています.
サインの結果セットを取得するためにジョイントを作成しようとしましたが、クエリは失敗します。列は次のようになります。
データベースの設計が自慢できるものではないことはわかっていますが、巨大な 1 つのテーブルから生まれたものであり、これは大きな一歩です (肩をたたく価値があります)。
私がやりたいことは、すべてのデータをクエリして、クラスの平均 (各クラスで約 30 人の学生) を計算できるようにすることです。別のクエリを使用しようとしましたが、以前はクエリの後に示されているように WHILE 条件を使用してすべての行をプルし、そこから目的の結果を取得できる配列を作成していたという壁にぶつかりました。現在、結合が機能していないため、いくつかのクエリで同じ結果をどのようにアーカイブできるかについて混乱しています。また、別の $row 変数を使用しているため、バランスがさらに崩れています。
悪名高い 1 つのテーブル (ダークサイドから) で行ったように、平均を計算することは可能ですか? それとも、テーブルのデザインがめちゃくちゃで、私が望むことは人間には不可能なのでしょうか?
どうぞよろしくお願いいたします。