如何在同一个表中找到与另一列相关的列?

时间:2013-09-09 06:35:53

标签: mysql sql

我有下表

  • quizId是db
  • 中测验的ID
  • userId对应于使用相应的quizId进行测验的用户

    quizId | userId 
      1    |   9
      1    |   10
      1    |   11
      2    |   11
      3    |   11
    
  • 现在,请将userId视为9。

  • 我需要一个只返回quizId' s

  • 的查询
  • 意思是,因为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 个答案:

答案 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中使用。