У меня есть такие таблицы:
Таблица ОТВЕТ
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).
Я попробовал много запросов. Я могу опубликовать их, если вы захотите.
Спасибо за ответы!
Вы можете попробовать следующее:
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]