Оператор SQL, который никогда не возвращает одну и ту же строку дважды? - PullRequest
0 голосов
/ 10 июля 2009

Требования : У меня есть таблица из нескольких тысяч вопросов. Пользователи могут просматривать эти вопросы с несколькими вариантами ответов и затем отвечать на них. После ответа на вопрос он не должен снова показываться тому же пользователю, даже если он через некоторое время входит в систему.

Вопрос

Как бы я поступил так эффективно? Будет ли Bloom Filters работать?

Ответы [ 5 ]

4 голосов
/ 10 июля 2009

Создайте Вопрос с ответом таблицу и присоединитесь к ней по своему выбору. Когда пользователь отвечает на вопрос, вставьте в таблицу идентификатор вопроса и идентификатор пользователя.

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 голос
/ 10 июля 2009

Создание таблицы «многие ко многим» между пользователями и вопросами (userQuestions) для хранения вопросов, на которые уже даны ответы. Тогда вы будете отображать только вопросы, которых нет в этой таблице userQuestions для этого пользователя.

1 голос
/ 10 июля 2009

Не могли бы вы добавить что-нибудь к информации о пользователях в базе данных, которая содержит список ответов на вопросы?

То есть, когда этот пользователь возвращается, вы можете показывать ему только те вопросы, на которые НЕ дан ответ?

0 голосов
/ 10 июля 2009

Кстати, если вы не можете создать таблицу для отслеживания показанных вопросов, то вы можете запрашивать вопросы в детерминированном порядке (т. Е. По идентификатору или по названию) и выбирать каждый раз тот, который имеет ранг выше последнего показанного ранга используя ROW_NUMBER () в SQL Server / Oracle / DB2 или LIMIT в MySQL). Вы бы отслеживали последний ранг, показанный где-то в вашем пользовательском состоянии (у вас есть пользовательское состояние, иначе весь вопрос не имеет смысла).

0 голосов
/ 10 июля 2009

Вы вставляете каждый показанный вопрос в таблицу журнала с помощью 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>);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...