Выберите пользователей, которые ответили на все вопросы

0

У меня есть такие таблицы:

Таблица ОТВЕТ

idAnswer   idQuestion   Status   idGame
----------------------------------------
1          9            1        1
2          6            NULL     1
3          6            1        2
4          3            NULL     2
5          1            1        3
6          6            1        3
7          9            1        4
8          6            1        4  

Таблица GAME:

idGame   idUser
----------------
1        Greg
2        Greg
3        Jack
4        Frank

Я хочу получить только тех, кто ответил на тот же вопрос, что и игра № 4, вот так:

Желаемый результат:

idUser
-------
Greg
Frank

Статус используется для проверки ответа на вопрос. Если он равен NULL, пользователь не ответил на него.

Здесь у Фрэнка была очень похожая игра (это очевидно, потому что это то же самое, № 4).

Грег не играл в подобную игру, но ответил на 2 других тем же самым вопросам, поэтому он появляется в результате.

Джек ответил на один из вопросов (№ 6), но не ответил на другой (№ 9), поэтому Джек не появляется.

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

Игры генерируются случайным образом. Иногда пользователь может ответить на вопрос, с которым они уже сталкиваются, и/или ответил. (Как Грег, в играх 1 и 2).

Я попробовал много запросов. Я могу опубликовать их, если вы захотите.

Спасибо за ответы!

  • 0
    Я не знаю, как сохранить интервал без использования кода, извините за это.
  • 0
    Не могли бы вы дать нам желаемый результат !!?
Показать ещё 2 комментария
Теги:

1 ответ

2
Лучший ответ

Вы можете попробовать следующее:

SELECT g.idUser, COUNT(*) as NumberOfAnswers
FROM answer a
      INNER JOIN game g ON a.idGame = g.idGame
WHERE a.idQuestion IN (9,6)
GROUP BY g.idUser
HAVING NumberOfAnswers = 2

Я думаю, что это решение соответствует вашим требованиям, если пользователи не могут ответить на один и тот же вопрос дважды в одной игре, и если вы не возражаете показывать пользователям, которые ответили на другие вопросы.

РЕДАКТИРОВАТЬ:

Для более общего решения вы можете адаптировать запрос к чему-то вроде этого:

SELECT g.idUser, COUNT(*) as NumberOfAnswers
FROM answer a
    INNER JOIN game g ON a.idGame = g.idGame
WHERE a.idCuestion IN (SELECT idQuestion FROM answer WHERE idGame=[DESIRED_GAME])
GROUP BY g.IdUser
HAVING NumberOfAnswers = (SELECT COUNT(*) FROM answer WHERE idGame = [DESIRED_GAME]
  • 1
    Это работает только для этого конкретного примера. Как только данные отличаются, это больше не даст желаемого результата.
  • 0
    @ E.Hekkert Адаптировать запрос к более общей среде не должно быть так сложно, если условия, которые я задаю после первого решения, верны. Однако я добавил общее решение тоже.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню