2

我有下表

  • quizId 是数据库中测验的 ID
  • userId 对应于使用相应 quizId 参加测验的用户

    quizId | userId 
      1    |   9
      1    |   10
      1    |   11
      2    |   11
      3    |   11
    
  • 现在,考虑 userId 为 9。

  • 我需要一个只返回 quizId 的 2 和 3 的查询

  • 意思是,由于 quizId 1 被 userId 9 占用,我不再想要它们。

这个想法是:

  • 在我正在制作的测验应用程序中,一个人只能参加一次测验。
  • 有一个页面,他可以在其中查看可用测验的列表。
  • 所以我只想展示他还没有参加过的测验。
  • 上表是一个 quizLog 表,其中存储了参加该测验的 quizId 和 userId

我很抱歉,但这是我能解释的最好方式。我希望有人能帮助理解和帮助我。而且我无法确定这是否是一个重复的问题,因为我不知道我应该搜索哪些关键字。抱歉,如果这是重复的。

编辑:

  • 我有一个名为“测验”的表格,其中存储了测验的详细信息
  • 我有一个名为“用户”的表,其中存储了用户详细信息
  • 上表称为“quizLog”

这是我现有的查询

    SELECT quiz.quizId,quiz.title
    FROM quiz
    JOIN quizlog
        ON quiz.quizId = quizlog.quizId
    WHERE condition
4

4 回答 4

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

连接版本可能在大多数数据库上表现更好。

于 2013-09-09T06:43:20.100 回答
0

获取将返回用户未回答的问题列表的查询。您必须编写以下查询。

SELECT quizId,title
FROM quiz WHERE quizId NOT IN
( SELECT quizId FROM quizLog WHERE userId = '9' );

这个想法是,当您在第一个查询中使用连接时,您将只获得 quizLog 中用户没有做的测验。这意味着如果 quiz table 中有 10 个测验,而 quizlog 中有 3 个测验,当我们知道用户号 9 为 userId 时,你会发现他并没有只做 2 和 3。所以避免在第一个 SELECT 中加入。因此它可以在第二个 SELECT 中使用。

于 2013-09-09T06:53:19.120 回答
0

尝试这个:

Declare @UserID=9

select quizId  from quiz as q1
where quizId not in (
  select quizId from quiz  as q2 
  where userId  = @UserID)
于 2013-09-09T06:46:04.837 回答
0

您还需要使用存储测验的表格。如果您从 quizLog 表中获取 quizId,您将只能看到有人已经参加过的测验,因此永远不会出现新的测验。

您可以在 quizLog 表上进行左连接,并获取不匹配的测验。

select q.quizId
from quiz q
left join quizLog l on l.quizId = q.quizId and l.userId = 9
where l.quizId is null
于 2013-09-09T06:44:03.410 回答