1

我正在使用嵌套的while循环来从2个不同的表中检索信息(学生,这两个表都通过主键链接的年级 - “id”)

我希望它以以下格式输出:

Student ID "123"

 - Grade 1 for ID "123"
 - Grade 2 for ID "123"

Student ID "555"

 - Grade 1 for ID "555"
 - Grade 2 for ID "555"

Student ID "666"

 - Grade 1 for ID "666"
 - Grade 2 for ID "666"

目前它的输出如下:

Student ID "123"

 - Grade 1 for ID "123" 
 - Grade 2 for ID "123"
 - Grade 1 for ID "555"
 - Grade 2 for ID "555" 
 - Grade 1 for ID "666" 
 - Grade 2 for ID "666"

Student ID "555"
Student ID "666"

这是PHP代码

<?php
include ("../../php/account.php");

$dbh = mysql_connect ( $hostname, $username, $password )
                   or die ( "Unable to connect to MySQL database" );
mysql_select_db( $project );

$s = mysql_query("SELECT * FROM newstudent");
$r = mysql_query("SELECT * FROM grades");  

while($rows=mysql_fetch_array($s))
    {
    echo "Student ID: ".$rows['id']."<br/>";
    echo "First Name: ".$rows['firstname']."<br/>";
    echo "Last Name: ".$rows['lastname']."<br/>";
    echo "Email: ".$rows['email']."<br/>";
    echo "<br/>";

            while($rows=mysql_fetch_array($r))
            {
                echo "Subject: ".$rows['subject']."<br/>";
                echo "Grade One: ".$rows['gradeone']."<br/>";
                echo "Grade Two: ".$rows['gradetwo']."<br/>";
                echo "Grade Three: ".$rows['gradethree']."<br/>";
                echo "<br/>";                
            }

    }

?>

如果有人知道解决方案,请帮助我!非常感谢!

4

5 回答 5

9

不要使用嵌套循环,使用 aJOIN在一个查询中获取所有结果:

$q = mysql_query("SELECT * FROM newstudent s
                  JOIN grades g ON s.id = g.student_id
                  ORDER BY s.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/>";
    }
    echo "Subject: ".$row['subject']."<br/>";
    echo "Grade One: ".$row['gradeone']."<br/>";
    echo "Grade Two: ".$row['gradetwo']."<br/>";
    echo "Grade Three: ".$row['gradethree']."<br/>";
    echo "<br/>";                
}
于 2013-10-31T23:20:29.777 回答
2

将您的成绩查询放在学生循环中并为其分配学生 ID,也不要$rows在循环中重新分配变量。

$s = mysql_query("SELECT * FROM newstudent");


while($rows=mysql_fetch_array($s))
    {
    echo "Student ID: ".$rows['id']."<br/>";
    echo "First Name: ".$rows['firstname']."<br/>";
    echo "Last Name: ".$rows['lastname']."<br/>";
    echo "Email: ".$rows['email']."<br/>";
    echo "<br/>";

    $r = mysql_query("SELECT * FROM grades WHERE studentID = '" . $row['id'] . "'");  

            while($r=mysql_fetch_array($r))
            {
                echo "Subject: ".$r['subject']."<br/>";
                echo "Grade One: ".$r['gradeone']."<br/>";
                echo "Grade Two: ".$r['gradetwo']."<br/>";
                echo "Grade Three: ".$r['gradethree']."<br/>";
                echo "<br/>";                
            }

    }
于 2013-10-31T23:15:54.247 回答
2

您正在覆盖$rows变量。

于 2013-10-31T23:18:13.820 回答
1

我认为你在第二个循环中覆盖了 $rows 变量。尝试使用 2 个不同的变量

编辑:内循环只是声明“打印所有成绩”,因此它与您在外循环中检查的学生没有关系。

正如其他人注意到的那样,肯定需要一个外键,它可以让您只获取您从第一个循环中获取的学生的成绩。

于 2013-10-31T23:13:29.517 回答
0

尝试这个

<?php
include ("../../php/account.php");

$dbh = mysql_connect ( $hostname, $username, $password )
                   or die ( "Unable to connect to MySQL database" );
mysql_select_db( $project );

$s = mysql_query("SELECT * FROM newstudent");

while($rows=mysql_fetch_array($s))
    {
    echo "Student ID: ".$rows['id']."<br/>";
    echo "First Name: ".$rows['firstname']."<br/>";
    echo "Last Name: ".$rows['lastname']."<br/>";
    echo "Email: ".$rows['email']."<br/>";
    echo "<br/>";

$r = mysql_query("SELECT * FROM grades");  

            while($rows1=mysql_fetch_array($r))
            {
                echo "Subject: ".$rows1['subject']."<br/>";
                echo "Grade One: ".$rows1['gradeone']."<br/>";
                echo "Grade Two: ".$rows1['gradetwo']."<br/>";
                echo "Grade Three: ".$rows1['gradethree']."<br/>";
                echo "<br/>";                
            }

    }

?>

在这里,您正在覆盖$rows变量。因此请尝试使用不同的变量名称。

于 2013-11-01T11:51:57.903 回答