SELECT中的AVG函数会影响查询输出中的行数

时间:2011-10-31 03:19:57

标签: php mysql database

以下是我的查询:

    $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行,并且不受影响,我可以存储在表下而不是在表中的平均值的计算?

1 个答案:

答案 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>".