【问题标题】:while loop and join output in mysql phpmysql php中的while循环和连接输出
【发布时间】:2013-11-01 14:39:10
【问题描述】:

我有一个通过数据库运行并将所有内容输出到 php 页面的代码。

$avg = mysql_query("SELECT subject, gradeone, gradetwo, gradethree, ((gradeone + gradetwo + gradethree) / 3) as average FROM grades");


$q = mysql_query("SELECT * FROM newstudent AS n JOIN grades AS g ON n.id = g.id ORDER BY n.id") or die (mysql_error());

$last_student = null;

while ($row = mysql_fetch_assoc($q))
    {
        if ($row['id'] !== $last_student)
        {
            $last_student = $row['id'];
            echo "Student ID: ".$row['id']."<br/>";
            echo "First Name: ".$row['firstname']."<br/>";
            echo "Last Name: ".$row['lastname']."<br/>";
            echo "Email: ".$row['email']."<br/>";
            echo "<br/>";
        }
            print "<table id=reporttable>"; 

            print "<tr id=toprow> <td>subject</td> <td>gradeone</td> <td>gradetwo</td> <td>gradethree</td> <td>average</td></tr>"; 

            print   "<tr>";          

                print   " <td>";    
                    print   $row["subject"];
                print   "</td>"  ;

                print   " <td>";    
                    print   $row["gradeone"];
                print   "</td>"  ;

                print   " <td>";    
                    print   $row["gradetwo"];
                print   "</td>"  ;

                print   " <td>";    
                    print   $row["gradethree"];
                print   "</td>"  ;

                while ($r = mysql_fetch_array($avg))
                {
                    print   " <td>";    
                        print   $r['average'];
                    print   "</td>"  ;
                }

            print   " </tr>";   
            print "</table>";             

}?>

期望的结果应该是这样的

以下代码的结果很好,但只有 1 个小问题。

假设第二个 while 循环计算平均值并在新行中输出每条记录。相反,它会这样做:

任何人都知道一种方法可以使这些平均成绩中的每一个都与学生的每一行一致吗?

【问题讨论】:

  • 这永远行不通。您只会得到 $avg 查询 ONCE 的结果。在它的结果被消耗并且您继续外部$q 查询的下一次迭代之后,$avg 结果集中将不再有结果,并且该内部循环将永远不会再次执行。您可以通过将 $avg = mysql_query(...) 查询调用移动到主循环内部来修复代码,但是您将在循环的每次迭代中运行一次该查询,这是非常低效的。
  • @MarcB 有解决办法吗?
  • 请向我们展示数据库表,以便我们尝试为您提供一个查询来获取所有信息。
  • @Bandydan 这涉及到 2 个不同的表:表 1 命名为 -newstudent,表 2 - 成绩:表 1 具有以下属性:id(两个表中的主键)、名字、姓氏, 电子邮件。第二张表有属性 - id, subject,gradeone,gradetwo,gradethree
  • 告诉我是否正确:成绩 id 与新生的 id 相同?我的意思是,如果我有 id=1 的新生,那么这个学生的成绩低于 id=1?

标签: php html mysql mysqli


【解决方案1】:
$q = mysql_query("
    SELECT
        n.id,
        n.firstname, 
        n.lastname,
        n.email,
        g.gradeone, 
        g.gradetwo, 
        g.gradethree, 
        ((g.gradeone + g.gradetwo + g.gradethree) / 3) AS average
    FROM
        newstudent n JOIN grades g USING (id)
    ORDER BY
        n.id
") or die (mysql_error());

尝试使用此查询,然后在一个循环中输出结果 - 删除它

while ($r = mysql_fetch_array($avg))

带大括号。

留下这样的东西:

....
print "<td>$row['gradetwo']</td>";
print "<td>$row['gradethree']</td>";

print "<td>$row['average']</td>";
....

【讨论】:

  • 唯一的1个问题,平均值以“99.9999”的方式得出,小数点后4位,有没有办法四舍五入?还是仅在点后显示 1 位小数? @bandydan
  • dev.mysql.com/doc/refman/5.0/en/… - 检查此链接并尝试示例,你会得到你需要的。
猜你喜欢
  • 2012-01-02
  • 2019-02-01
  • 2018-07-12
  • 1970-01-01
  • 2011-11-30
  • 1970-01-01
  • 2014-01-03
  • 1970-01-01
  • 2012-05-01
相关资源
最近更新 更多