我正在开展一个学生参加测试的项目 - 其中一些限定词是他们只能接受他们注册的测试(按课程),并且他们只能进行一次测试。我已经弄清楚了大部分..但我正在使用SELECT语句在下拉菜单中使用。我有一个问题。
相关结构,仅包含列名:
所以基本上,在测验完成后 - 所有结果都会转到另一个名为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'
哪个有效 - 技术上。但是你会看到这里的问题是什么..如果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'是Session UserID的占位符 - 但也是测试人员,因为我有两个历史测试,我有一个条目说这个学生已经选择了其中一个。但是我无法正常工作。
我在这里做错了什么帮助?
答案 0 :(得分: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'
现在,它只会查找用户Complete
的{{1}}条记录。
答案 1 :(得分: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
。如果Complete.UserId = 2,则Complete.QuizId永远不会是NULL
。
答案 2 :(得分: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'