2

这是一个课程安排应用程序。有一个课程表(id、开始时间、结束时间等),它将通过连接表(通过 ID)链接到学生表(id、名字、姓氏等)和教师表(id、名字, 姓氏等)。这些都是多对多的关系。课程可以有多个学生,学生可以有多个课程。对于老师也是如此。

我的问题是,获取和显示数据的最佳方式是什么?我希望能够列出按日期排序的每节课以及课程中的学生和课程的老师。

一种方法是使用 sql 查询来查找所有课程并通过它们的连接表连接所有表。然后使用循环将它们全部吐出到页面上的表格中。我遇到的问题是,创建的表格在不同的行上列出了相同的课程,以说明每个学生和老师。当尝试按课程开始时间或 ID 浏览时,这会产生一个非常冗余的列表。

将每节课显示为列表中的一行的最佳方法是什么,其中一个包含所有学生的学生列和一个包含所有教师的教师列?

对不起,如果这不清楚。感谢您的任何意见,如果我需要澄清或添加更多详细信息,请告诉我。

表列:

学生表学生
ID名字姓氏电子邮件等

教师表
teacherID firstName lastName email 等

课程表
courseID startTime endTime

课程/学生 Junc 表
juncID courseFK StudentFK

课程/教师 Junc 表
juncID courseFK TeacherFK

所需的输出: https ://docs.google.com/file/d/0BxmJPAg7gA1AODZKOUg1RXFwMDQ/edit?usp=sharing

更新:我在哪里。我想我明白了

<?php $lesson_set = find_all_lessons(); ?>
            <table>
                <tr>
                    <td>Start Time</td>
                    <td>Lesson ID</td>
                    <td>Teachers</td>
                    <td>Students</td>

                </tr>

            <?php while($lesson = mysqli_fetch_assoc($lesson_set)) { ?>

                <tr>
                    <td><?php echo htmlentities($lesson["startTime"]); ?></td>
                    <td><?php echo htmlentities($lesson["lessonID"]); ?></td>
                    <td><?php
                        $teachers_in_lesson_set = find_teachers_by_lesson_id($lesson["lessonID"]);

                        while($lesson_teacher = mysqli_fetch_assoc($teachers_in_lesson_set)) {
                            echo htmlentities ($lesson_teacher["firstName"]." ".$lesson_teacher["lastName"].", ");

                        }


                    ?></td>

                    <td><?php 
                        $students_in_lesson_set = find_students_by_lesson_id($lesson["lessonID"]);

                        while($lesson_student = mysqli_fetch_assoc($students_in_lesson_set)) {
                            echo htmlentities ($lesson_student["firstName"]." ".$lesson_student["lastName"].", ");

                        }

                    ?></td>



                </tr>
            <?php } ?>
</table>

功能

   function find_all_lessons() {
        global $connection;

        $query  = "SELECT * ";
        $query .= "FROM lesson ";
        $query .= "ORDER BY startTime ASC";
        $lesson_set = mysqli_query($connection, $query);
        confirm_query($lesson_set);
        return $lesson_set;
}   


function find_students_by_lesson_id($lesson_id) {
    global $connection;

    $safe_lesson_id = mysqli_real_escape_string($connection, $lesson_id);

    $query = "SELECT * ";
    $query .= "FROM junc_lesson_student ";
    $query .= "JOIN student ON student.studentID = junc_lesson_student.studentFK ";
    $query .= "JOIN lesson ON lesson.lessonID = junc_lesson_student.lessonFK ";
    $query .= "WHERE lessonID = {$safe_lesson_id} ";
    $query .= "ORDER BY firstName ASC ";


    $students_in_lesson_set = mysqli_query($connection, $query);
    confirm_query($students_in_lesson_set);
    return $students_in_lesson_set;

}

find_teachers_by_lesson_id 函数与学生函数相同,只是访问教师表。

在实践中这是可行的,但有人可以评论结构吗?这是一个可以接受的解决方案,还是会在以后给我带来问题?再次感谢您的所有意见!

4

1 回答 1

0

好的,这应该让你进入心态。

I am using id as a selector for simplification but you could use anything through a POST or GET variable, or just remove the WHERE clause altogether to get all the data.

$query = "SELECT lessonID, startTime
FROM lessonTable 
WHERE id = '$id'";
$lessonResult = mysqli_query($link, $query);

$query = "SELECT firstName 
FROM studentTable 
WHERE id = '$id'";
$studentResult = mysqli_query($link, $query);

$query = "SELECT firstName 
FROM teacherTable 
WHERE id = '$id'";
$teacherResult = mysqli_query($link, $query);

echo "<table>";
while ($row = mysqli_fetch_array($lessonResult)) {
    echo "<tr>"
    echo "<td>{$row['startTime']}</td>";
    echo "<td>{$row['lessonID']}</td>";
    echo "<td>";
    while ($row = mysqli_fetch_array($teacherResult)) {
        $firstNameString = implode(',', $row['firstName']);
        echo $firstNameString;
    }
    echo "</td>";
    echo "<td>";
    while ($row = mysqli_fetch_array($studentResult)) {
        $firstNameString = implode(',', $row['firstName']);
        echo $firstNameString;
    }
    echo "</td>";
    echo "</tr>"
}
echo "</table>";

mysqli_free_result($lessonResult);
mysqli_free_result($teacherResult);
mysqli_free_result($studentResult);
于 2013-10-04T18:16:11.090 回答