0

请容忍我 - 这可能有点令人困惑。

我正在使用 SQL 检索两组数据。这是带有查询的代码。我正在使用 Zend 框架。

$assignments = $db->fetchAll("SELECT id,name,class FROM assignments");
foreach($assignments as $a) {
    $assignmentID = $a['id'];
    $studentData = $db->fetchAll(
        "SELECT student,assignment,status,assignmentID FROM student_assignments WHERE assignmentID='$assignmentID'"
    );

    echo "<th>".$a['name']."</th>";

    foreach($studentData as $s) {
        $bottom .= "<tr><td>" . $s['student'] . " " . $s['assignmentID'] 
                   . " ".$s['status'] . "</td></tr>";
        $i++;
    }
}
echo "</tr>$bottom;";

以下是 HTML 中的输出:

|Assignment on 07/07/2012|  |Assignment on 07/12/2012|   |Assignment on 07/15/2012|
117 1 Y
332 1 N
36 1 N
420 1 N
332 1 Y
326 2 N
212 2 N
461 2 N
117 2 N
212 2 N
212 3 N
326 3 N
117 3 Y
420 3 Y

现在顶部工作得很好——它动态地显示了数据库中的每个分配。但我一直在试图找出一种方法来让适当的数据显示在这些列下,但没有效果。这是我最接近让它看起来有点正确的方法。

本质上,中间有“2”和“3”的数据应该分别进入第二列和第三列。但这并没有发生,因为所有数据都存储在 $bottom 变量中,而不是每个分配的数据。

有没有人有什么建议?这让我发疯,我觉得解决方案正盯着我看。

谢谢!

4

1 回答 1

1

首先,您要遍历您的每个学生作业,然后将作业表左连接到它,这样您就可以知道与之相关的作业的名称。

$students = $db->fetchAll('SELECT sa.student,sa.assignment,sa.status,sa.assignmentID,a.name
                           FROM student_assignments AS sa
                           LEFT JOIN assignments AS a ON sa.assignmentID=a.id');

然后根据结果,您可以构建一个数组来重新组合具有相同分配的每个人:

$columns = Array();
foreach($students as $s) {
    $row = '<tr><td>'.$s['student'].' '.$s['assignmentID'].' '.$s['status'].'</td></tr>';
    array_push($columns[$s['name']], $row);
}

然后使用这个数组,你终于可以打印你的内容了:

foreach ($columns as $key=>$value) {
    echo '<th>'.$key.'</th>';
    foreach ($value as $v) {
        echo $v;
    }
}

当然这可以更紧凑(减少为嵌套循环),我无法完全测试它,但它应该在你的过程中帮助你;)

于 2012-07-17T22:45:10.707 回答