Abbiamo una tabella che usiamo per memorizzare le risposte alle domande. Dobbiamo essere in grado di trovare utenti che abbiano determinate risposte a domande particolari. Quindi, se la nostra tabella è composta dai seguenti dati:
user_id question_id answer_value
Sally 1 Pooch
Sally 2 Peach
John 1 Pooch
John 2 Duke
e vogliamo trovare utenti che rispondano a "Pooch" per la domanda 1 e "Peach" per la domanda 2, il seguente SQL (ovviamente) non preoccuperà:
select user_id
from answers
where question_id=1
and answer_value = 'Pooch'
and question_id=2
and answer_value='Peach'
Il mio primo pensiero è stato quello di unirmi al tavolo per ogni risposta che stiamo cercando:
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'
Funziona, ma poiché consentiamo un numero arbitrario di filtri di ricerca, dobbiamo trovare qualcosa di molto più efficiente. La mia prossima soluzione fu qualcosa del genere:
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
Tuttavia, desideriamo che gli utenti siano in grado di prendere due volte lo stesso questionario, quindi potrebbero potenzialmente avere due risposte alla domanda 1 nella tabella delle risposte.
Quindi, ora sono in perdita. Qual è il modo migliore per affrontare questo? Grazie!