0

ユーザーが登録されているクラスの割り当ての ID をエコーするこのクエリがあります。

$sql = $db->prepare("SELECT assignments.*, enrollments.course_id, enrollments.student_id
                        FROM assignments
                        LEFT JOIN enrollments
                        ON assignments.course_id = enrollments.course_id
                        LEFT JOIN completed
                        ON assignments.id != completed.assignment_id
                        WHERE enrollments.student_id = ?
                        ORDER BY assignments.id DESC LIMIT 10
                        ");

$sql->execute(array($login_id));

while($row = $sql->fetch())
        {
                echo $row['id'];
        }

課題が完了としてマークされているかどうかを確認する別のチェックを行う最良の方法は何ですか?

これは、「完了」テーブルもチェックし、選択された割り当てのいずれかについて $login_id と assignment.id が一緒に存在する行がないことを確認する必要があることを意味します。

これは、ログインしているユーザーの完了した割り当て ID を見つけるためのクエリです。

$sqlcomplete = $db->prepare("SELECT * FROM completed
INNER JOIN students ON completed.student_id = students.id
WHERE completed.student_id = ?
");

$sqlcomplete->execute(array($login_id));

while($row = $sqlcomplete->fetch(PDO::FETCH_ASSOC))
{
echo "<li>You have completed assignment with ID ".$row['assignment_id']."</li>";
}

もっと複雑なことをしようとしましたが、それJOINを理解できないようです。また、ユーザーが完了した割り当ての ID の配列を、そのデータベースだけにクエリを実行して単純に作成し、その ID を while チェックに投入することも検討しましたが、それは最善または最も効率的な解決策ではないように感じます。

4

1 に答える 1

2

LEFT JOINandを使用できcompleted.assignment_id IS NULLます。これは、完成したテーブルから一致が返されなかったことを意味します。

SELECT assignments.*, enrollments.course_id, enrollments.student_id
FROM assignments
 LEFT JOIN enrollments ON assignments.course_id = enrollments.course_id
 LEFT JOIN completed ON assignments.id = completed.assignment_id
WHERE enrollments.student_id = ?
AND completed.assignment_id IS NULL
ORDER BY assignments.id DESC LIMIT 10
于 2013-02-22T19:06:08.683 に答える