从不返回同一行的SQL语句两次?

时间:2009-07-10 00:52:53

标签: sql

要求:我有几千个问题的表格。用户可以查看这些多项选择题,然后回答它们。一旦问题得到解答,即使他在一段时间后登录,也不应再向同一用户显示。

问题

我将如何有效地做到这一点? Bloom Filters会有效吗?

5 个答案:

答案 0 :(得分:4)

创建 QuestionsAnswered 表并在您的选择中加入。当用户回答问题时,将问题ID和用户ID插入表中。

CREATE TABLE QuestionsAnswered (UserID INT, QuestionID INT)

SELECT *
FROM Question
WHERE ID NOT IN (SELECT QuestionID 
                 FROM QuestionsAnswered
                 WHERE UserID = @UserID)

INSERT INTO QuestionsAnswered
(UserID, QuestionID)
VALUES
(@UserID, @QuestionID)

答案 1 :(得分:1)

您是否可以在数据库中添加包含已回答问题列表的用户信息?

那么当该用户回来时,您只能向他们展示未回答的问题吗?

答案 2 :(得分:1)

在用户和问题(userQuestions)之间创建多对多表,以存储已经回答的问题。然后,您只显示该用户的userQuestions表中不存在的问题。

答案 3 :(得分:0)

您将显示的每个问题都插入到带有question_id / user_id的日志表中,然后向他显示那些不匹配的问题:

SELECT [TOP 1] ...
  FROM questions 
  WHERE question_id NOT IN (
   SELECT question_id
   FROM question_user_log
   WHERE userd_id = <current_user>)
[ORDER BY ...]

SELECT [TOP 1] ...
   FROM questions AS q
   LEFT OUTER JOIN question_user_log AS l ON q.question_id = l.question_id
     AND l.user_id = <current_user>
   WHERE l.question_id IS NULL
[ORDER BY...]
显示问题后

INSERT INTO question_user_log (question_id, user_id) 
  VALUES (<question shown>, <current_user>);

答案 4 :(得分:0)

顺便说一句,如果你不能创建一个表来跟踪显示的问题,那么你可以按确定的顺序查询问题(即通过Id或标题),并选择每次排名高于最后排名的那个(在SQL Server / Oracle / DB2中使用ROW_NUMBER(),或在MySQL中使用LIMIT)。您将跟踪显示在用户状态某处的最后一个排名(您确实拥有用户状态,否则整个问题毫无意义)。