1

私は、学生がテストを受けるプロジェクトに取り組んでいます。いくつかの修飾子は、(クラスごとに) 登録されているテストしか受けられず、各テストは 1 回しか受けられないというものです。私はそれをほとんど理解しています..しかし、私はドロップダウンメニューで使用するためのSELECTステートメントに取り組んでいます。そして、私は問題を抱えています。

列名のみの関連構造:

ユーザーテーブル

  • ユーザーID

クイズ表

  • クイズID

完全な表

  • ユーザーID
  • クイズID

基本的に、クイズが完了すると、すべての結果がリザルトという別のテーブルに移動しますが、ユーザーの ID とクイズ ID を記録する完了テーブルにもエントリが作成されます。次に、次の SQL ステートメントを作成してドロップダウンに入力します。

SELECT Quiz.QuizID, Quiz.QuizName
FROM Quiz
LEFT JOIN Complete ON Complete.QuizID = Quiz.QuizID
WHERE Complete.QuizID IS NULL
AND Quiz.Class = 'History'

どちらが機能しますか-技術的に。しかし、ここで何が問題なのかがわかります. History クラスの誰かがテストを受けると.. History クラスの他の誰もテストを受けることができなくなります。そのため、それをユーザー ID で区切る必要があります。私は次のようなことを試しました:

SELECT Quiz.QuizID, Quiz.QuizName
FROM Quiz
LEFT JOIN Complete ON Complete.QuizID = Quiz.QuizID
WHERE Complete.QuizID IS NULL
AND Quiz.Class = 'History'
AND Complete.UserID = (SELECT UserID
FROM User
WHERE UserID = '2')

ここで、「2」はセッション ユーザー ID のプレースホルダーですが、テスターでもあります。これは、2 つの履歴テストがあり、この学生がそのうちの 1 つを取得したというエントリがあるためです。しかし、私はこれを適切に機能させることができません。

ここで私が間違っていることについて何か助けはありますか?

4

3 に答える 3

0

提案された他の解決策は機能するはずですが、where 条件を join 句で区切って保持したい場合は、単純な OR でうまくいくと思います。

   SELECT Quiz.QuizID, 
          Quiz.QuizName
     FROM Quiz
LEFT JOIN Complete 
       ON Complete.QuizID = Quiz.QuizID
    WHERE (Complete.QuizID IS NULL -- let's show the quiz never completed
          OR
           Complete.UserID <> 2    -- or completed by someone who isn't 2 :)
          )
      AND Quiz.Class = 'History'
于 2013-04-02T14:40:26.293 に答える