协调具有动态行和列的表的问题

时间:2012-07-17 21:47:33

标签: php mysql sql

在这里忍受我 - 这可能有点令人困惑。

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

$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”的数据应分别进入第2和第3列。但这并没有发生,因为所有数据都存储在$ bottom变量中,而不是每个赋值的数据。

有没有人有任何建议?这让我发疯,我觉得解决方案正在盯着我。

谢谢!

1 个答案:

答案 0 :(得分: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;
    }
}

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