我有下表
userId对应于使用相应的quizId进行测验的用户
quizId | userId
1 | 9
1 | 10
1 | 11
2 | 11
3 | 11
现在,请将userId视为9。
我需要一个只返回quizId' s
意思是,因为quizId 1是由userId 9拍摄的,所以我再也不想要它们了。
这个想法是:
对不起,这是我能解释的最佳方式。我希望有人可以帮助理解并帮助我。我无法确定这是否是一个重复的问题,因为我不知道我应该搜索哪些关键字。对不起,如果这是重复的。
修改
这是我现有的查询
SELECT quiz.quizId,quiz.title
FROM quiz
JOIN quizlog
ON quiz.quizId = quizlog.quizId
WHERE condition
答案 0 :(得分:1)
最简单易懂的查询是:
select *
from quiz
where id not in (
select quiz_id
from user_quiz
where user_id = 9)
更先进的方法是:
select *
from quiz q
left join user_quiz uq
on uq.quiz_id = q.id
and uq.user_id = 9
where uq.user_id is null
加入版本可能在大多数数据库上表现更好。
答案 1 :(得分:0)
您还需要使用存储quizes的表。如果从quizLog表中获取quizId,您将只看到某人已经采取的那些,因此新的quizes将永远不会出现。
您可以在quizLog表上进行左连接,并获得没有匹配的quizes。
select q.quizId
from quiz q
left join quizLog l on l.quizId = q.quizId and l.userId = 9
where l.quizId is null
答案 2 :(得分:0)
试试这个:
Declare @UserID=9
select quizId from quiz as q1
where quizId not in (
select quizId from quiz as q2
where userId = @UserID)
答案 3 :(得分:0)
获取将返回用户未接受的问题列表的查询。您必须编写以下查询。
SELECT quizId,title
FROM quiz
WHERE quizId NOT IN
(
SELECT quizId
FROM quizLog
WHERE userId = '9'
);
我们的想法是,当您在第一个查询中使用连接时,您将只获得用户未执行的quizLog中的调整。这意味着如果在测验表中有十个测验并且在测验日中有3个测验,那么当我们知道用户编号9为userId时,您将得到他没有仅执行2和3。所以避免在第一个SELECT中加入。因此它可以在第二个SELECT中使用。