【问题标题】:Displaying information obtained from multiple junction tables with MySQL and PHP使用 MySQL 和 PHP 显示从多个联结表获得的信息
【发布时间】:2013-10-11 16:12:44
【问题描述】:

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

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

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

让每节课在列表中显示为一行的最佳方式是什么?学生列包含所有学生,教师列包含所有教师?

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

表格列:

学生桌
studentID firstName lastName email etc

教师桌
教师ID名字姓氏电子邮件等

课桌
课程ID开始时间结束时间

课程/学生桌
juncID 课程FK StudentFK

课程/教师交流桌
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 函数与 student 函数相同,只是访问的是教师表。

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

【问题讨论】:

  • 张贴一张你想要的表格和输出的图表。
  • 我已经添加了表格列和所需的输出。谢谢
  • 看起来您在数据库布局方面走在了正确的轨道上,但这是一个相当复杂的查询,请查看“内部联接”和“子”查询。以前有,然后发回您尝试过的内容。抱歉,感觉就像您希望我们为您做这件事。这个网站太棒了:tizag.com/mysqlTutorial/mysqljoins.php
  • 我以前从未做过这样的事情,我脑子里已经有了我认为可行的方法。与其在两者上浪费时间,我想我会看看是否有人以前做过这样的事情来让我朝着正确的方向前进。我将尝试实施您的一些帖子并进行报告。感谢您的意见!
  • 我想我明白了。感谢您的帮助!

标签: php mysql junction-table


【解决方案1】:

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

我使用 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    相关资源
    最近更新 更多