【问题标题】:Use of AVG function in MySQLMySQL中AVG函数的使用
【发布时间】:2011-03-15 15:55:24
【问题描述】:

我想知道我数据库中排名前 3 的学生,所以我使用了 AVG 函数,但似乎我有一些错误,这是我的代码:

$result = mysql_query("SELECT grade.GStudNo, AVG(grade.Grade) as Grade, students.LName, students.FName, students.MName, students.Course
FROM students INNER JOIN grade ON students.StudNo = grade.GStudNo
WHERE GSem = '1st Semester' AND GYear = '2007'
GROUP BY grade.GStudNo
ORDER BY AVG(grade.Grade) ASC")
...
<?php while($myrow = mysql_fetch_assoc($result))
{?>
  <tr>
    <td><?php echo "$myrow[LName] ";echo "$myrow[FName] "; echo "$myrow[MName]"; ?></td>
    <td><?php echo "$myrow[Grade]";?></td>
  </tr>
<?php } ?>

这是错误消息:注意:未定义索引:第 368 行 C:\xampp\htdocs\strawman\default.php 中的等级

但我定义了 AVG(grade.Grade)AS Grade.. :(

【问题讨论】:

  • @PiDo:你说的是but it seems i have some errors 。能否请您发布错误消息?
  • 那些错误会是......?
  • 您的错误是什么?我会开始考虑不按函数排序,如果您包含聚合列,则选择必须包含聚合或参与分组依据的列。
  • @Hadley - 不在MySQL 中,您可以按PK 分组,然后在选择列表中选择其他表格列。程序员有责任确保所选列只能存在一个值,但不能分组,就好像有多个结果未定义一样。
  • $result 似乎没有返回任何行。

标签: php mysql average


【解决方案1】:

MySQL 可能会感到困惑,因为您使用字段名称 Grade 作为别名,然后在 ORDER 子句中的 AVG 中再次使用它。试试这个(它只调用一次 AVG):

SELECT grade.GStudNo, AVG(grade.Grade) as gradeAverage ... 
ORDER BY gradeAverage ASC

而且,为什么要在变量周围使用双引号?这样处理起来会快得多:

<?php echo $myrow['LName'] .' '. $myrow['FName'] .' '. $myrow['MName']; ?>

【讨论】:

  • 还是Undefined index: Grade?你的第二个专栏现在应该是&lt;?php echo $myrow['gradeAverage'];?&gt;,所以错误应该至少是Undefined index: gradeAverage
【解决方案2】:

您正在使用以下语法:

<?php echo "$myrow[LName] ";

你会想要使用这样的东西:

<?php echo "$myrow['LName'] ";

或者,使用双引号时我的首选语法:

<?php echo "{$myrow['LName']} ";

其他变量也是如此。

省略引号将导致 PHP '猜测'你的意思。有时会很好,有时会很糟糕。

【讨论】:

  • 那么你可以尝试以下(在while-loop 中)并发布结果吗? print_r($myrow);
  • 这是结果:print_r{(Array)['Grade']}
  • "$myrow[LName]" 是正确的语法。在双引号字符串中使用单引号数组键是不正确的,并且会发出警告。不过{} 版本还可以。
  • 为什么不只是echo $myrow['LName'];... 不需要更多的引号或大括号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-29
  • 2016-05-26
  • 2013-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多