Temos uma tabela que usamos para armazenar respostas a perguntas. Precisamos ser capazes de encontrar usuários que tenham certas respostas para perguntas específicas. Portanto, se nossa tabela consistir nos seguintes dados:
user_id question_id answer_value
Sally 1 Pooch
Sally 2 Peach
John 1 Pooch
John 2 Duke
e queremos encontrar usuários que respondam 'Pooch' para a pergunta 1 e 'Peach' para a pergunta 2, o seguinte SQL (obviamente) não funcionará:
select user_id
from answers
where question_id=1
and answer_value = 'Pooch'
and question_id=2
and answer_value='Peach'
Meu primeiro pensamento foi participar da tabela automaticamente para cada resposta que procuramos:
select a.user_id
from answers a, answers b
where a.user_id = b.user_id
and a.question_id=1
and a.answer_value = 'Pooch'
and b.question_id=2
and b.answer_value='Peach'
Isso funciona, mas como permitimos um número arbitrário de filtros de pesquisa, precisamos encontrar algo muito mais eficiente. Minha próxima solução foi algo assim:
select user_id, count(question_id)
from answers
where (
(question_id=2 and answer_value = 'Peach')
or (question_id=1 and answer_value = 'Pooch')
)
group by user_id
having count(question_id)>1
No entanto, queremos que os usuários possam responder ao mesmo questionário duas vezes, para que possam ter duas respostas para a pergunta 1 na tabela de respostas.
Então, agora estou perdida. Qual é a melhor maneira de abordar isso? Obrigado!
fonte
Eu gosto do método join, eu mesmo:
Atualizar Após testar com uma tabela maior (~ 1 milhão de linhas), esse método demorou significativamente mais que o
OR
método simples mencionado na pergunta original.fonte
Estávamos juntando o
user_id
daanswers
tabela em uma cadeia de junções para obter dados de outras tabelas, mas isolar a tabela de respostas SQL e escrevê-las em termos tão simples me ajudou a identificar a solução:Estávamos desnecessariamente usando uma segunda subconsulta.
fonte
Se você tiver um grande conjunto de dados, eu faria dois índices:
Você precisará ingressar várias vezes devido à maneira como os dados são organizados. Se você souber qual valor para qual pergunta é menos comum, poderá acelerar um pouco a consulta, mas o otimizador deve fazer isso por você.
Tente a consulta como:
A tabela a1 deve usar o primeiro índice. Dependendo da distribuição dos dados, o otimizador pode usar qualquer um dos índices. A consulta inteira deve ser satisfeita nos índices.
fonte
Uma maneira de abordar isso é obter um subconjunto de user_id e testá-los para a segunda correspondência:
Usando a estrutura de Rolando:
Rendimentos:
fonte