1

我正在开展一个学生参加考试的项目 - 其中一些限定条件是他们只能参加他们注册的考试(按班级),并且他们只能参加一次考试。我已经弄清楚了大部分......但我正在研究一个用于下拉菜单的 SELECT 语句。我有一个问题。

相关结构,只有列名:

用户表

  • 用户身份

测验表

  • 测验ID

完成表

  • 用户身份
  • 测验ID

所以基本上,在测验完成后 - 所有结果都会转到另一个名为 Results 的表中,但在 Complete 表中也会创建一个条目,记录用户 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'

哪个有效 - 从技术上讲。但是你会看到这里的问题是什么……如果历史课上有人参加考试……那么历史课上没有其他人可以参加考试。所以我必须通过用户 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”是 Session UserID 的占位符 - 但也是一个测试人员,因为我有两个历史测试,并且我有一个条目说这个学生已经参加了其中一个。但我无法让它正常工作。

对我在这里做错了什么有任何帮助吗?

4

3 回答 3

1

将条件移至UserID子句on

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

现在,它将只查找Completeuser 的记录2

于 2013-04-02T13:52:05.443 回答
1

这是你要找的吗?它将您的 userId 检查移动到您的JOIN标准:

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

通过检查您的WHERE标准中的 userId,它会否定LEFT JOIN. NULL如果 Complete.UserId = 2,Complete.QuizId 永远不会存在。

于 2013-04-02T13:52:29.060 回答
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 回答