2

レッスン予約アプリです。ジャンクション テーブルを介して (ID を介して) 生徒テーブル (ID、名、姓など) および教師テーブル (ID、名、名前など) にリンクするレッスン テーブル (ID、開始時間、終了時間など) があります。 、姓など)。これらはすべて多対多の関係です。レッスンは複数の生徒を持つことができ、生徒は複数のレッスンを持つことができます。教師に対しても同様です。

私の質問は、データを取得して表示するための最良の方法は何ですか? 日付順に並べ替えられた各レッスンを、レッスンの生徒とレッスンの教師とともにリストできるようにしたいと考えています。

1 つの方法は、SQL クエリを使用してすべてのレッスンを検索し、ジャンクション テーブルを介してすべてのテーブルを結合することです。次に、ループを使用してそれらをすべてページ上の表に吐き出します。私が直面している問題は、作成されるテーブルが、各生徒と教師を説明するために異なる行に同じレッスンをリストすることです。これにより、レッスンの開始時間または ID でブラウズしようとすると、非常に冗長なリストが作成されます。

すべての生徒を含む生徒の列とすべての教師を含む教師の列を含むリストに、各レッスンを 1 行として表示する最良の方法は何でしょうか?

これが不明な場合は申し訳ありません。ご意見をお寄せいただきありがとうございます。詳細を明確にしたり追加したりする必要がある場合はお知らせください。

表の列:

Student テーブル
studentID firstName lastName email など

Teacher テーブル
teacherID firstName lastName email など

レッスン テーブル
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 関数は、教師テーブルへのアクセスを除いて、生徒のものと同じです。

実際にはこれは機能しますが、誰かが構造についてコメントできますか? これは受け入れられる解決策ですか、それとも後で問題が発生する可能性がありますか? ご意見をお寄せいただきありがとうございます。

4

1 に答える 1

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);
于 2013-10-04T18:16:11.090 に答える