以下是我的查询:
$query = "
SELECT *
FROM Teacher t
INNER JOIN Session s ON t.TeacherId = s.TeacherId
JOIN Grade_Report gr ON s.SessionId = gr.SessionId
WHERE
('".mysql_real_escape_string($sessionid)."' = '' OR gr.SessionId = '".mysql_real_escape_string($sessionid)."') ";
结果存储在一个表中,代码如下所示:
<table border='1'>
<tr>
<th>Session ID</th>
<th>Student Username</th>
<th>Student Name</th>
<th>Mark</th>
<th>Grade</th>
</tr>
<?php
while ($row = mysql_fetch_array($result)) {
echo "
<tr>
<td>{$row['SessionId']}</td>
<td>{$row['StudentUsername']}</td>
<td>{$row['StudentForename']} {$row['StudentSurname']}</td>
<td>{$row['Mark']}</td>
<td>{$row['Grade']}</td>
</tr>";
}
此查询在结果中输出13行,当它选择所有行时就可以了。
现在发生的事情是我想要每个会话的平均分数。因此,我在查询中添加了'AVG(gr.Mark) as AvgMark'
,并在表格中包含<td>{$row['AvgMark']}</td>
。它输出的计算是正确的问题是查询现在只输出1行,这是查询结果的顶行。我理解这一点,因为AVG(gr.Mark)
在输出时只需要一行。
所以我的问题是,除了在查询中使用SELECT
'AVG(gr.Mark)作为AvgMark'以查找每个会话的平均分数外,是否有一种方法可以查询查询外的每个标记的平均值通过使用PHP,以便查询输出显示13行,并且不受影响,我可以存储在表下而不是在表中的平均值的计算?
答案 0 :(得分:1)
AVG返回一行的原因是它是一个聚合函数,没有GROUP BY子句对所有行都有效。
PHP的平均值与其他地方的平均值一样;总计您的值并除以样本数。因此,您可以通过将代码更改为:
轻松计算代码中的平均值 <?php
$total = 0;
$count = 0;
while ($row = mysql_fetch_array($result)) {
$count++;
$total += $row['Mark'];
echo "
<tr>
<td>{$row['SessionId']}</td>
<td>{$row['StudentUsername']}</td>
<td>{$row['StudentForename']} {$row['StudentSurname']}</td>
<td>{$row['Mark']}</td>
<td>{$row['Grade']}</td>
</tr>";
}
$average = (int)($total/$count);
echo "<tr><td colspan=3></td><td>Average</td><td>$average</td></tr>".