SQL子查询/左连接问题

时间:2013-04-02 13:48:10

标签: mysql sql

我正在开展一个学生参加测试的项目 - 其中一些限定词是他们只能接受他们注册的测试(按课程),并且他们只能进行一次测试。我已经弄清楚了大部分..但我正在使用SELECT语句在下拉菜单中使用。我有一个问题。

相关结构,仅包含列名:

用户表

  • 用户ID

测验表

  • QuizID

完整表格

  • 用户ID
  • QuizID

所以基本上,在测验完成后 - 所有结果都会转到另一个名为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的占位符 - 但也是测试人员,因为我有两个历史测试,我有一个条目说这个学生已经选择了其中一个。但是我无法正常工作。

我在这里做错了什么帮助?

3 个答案:

答案 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'