使用MySQL和PHP显示从多个联结表中获取的信息

时间:2013-10-04 15:24:34

标签: php mysql junction-table

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

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

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

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

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

表格列:

学生表
studentID firstName lastName电子邮件等

教师表
teacherID firstName lastName电子邮件等

课程表
lessonID startTime endTime

课程/学生Junc表
juncID lessonFK StudentFK

课程/教师Junc表
juncID lessonFK 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功能与学生功能相同。

在实践中,这有效,但有人可以评论结构吗?这是一个可以接受的解决方案还是会在以后的路上引起我的问​​题?再次感谢您的所有投入!

1 个答案:

答案 0 :(得分:0)

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

我使用id作为简化选择器,但你可以通过POST或GET变量使用任何东西,或者只是删除WHERE子句来获取所有数据。

$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);