Wir haben eine Tabelle, in der wir Antworten auf Fragen speichern. Wir müssen in der Lage sein, Benutzer zu finden, die bestimmte Antworten auf bestimmte Fragen haben. Also, wenn unsere Tabelle aus folgenden Daten besteht:
user_id question_id answer_value
Sally 1 Pooch
Sally 2 Peach
John 1 Pooch
John 2 Duke
und wir möchten Benutzer finden, die 'Pooch' für Frage 1 und 'Peach' für Frage 2 beantworten. Die folgende SQL wird (offensichtlich) nicht funktionieren:
select user_id
from answers
where question_id=1
and answer_value = 'Pooch'
and question_id=2
and answer_value='Peach'
Mein erster Gedanke war, mich für jede Antwort, die wir suchen, selbst an den Tisch zu setzen:
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'
Dies funktioniert, aber da wir eine beliebige Anzahl von Suchfiltern zulassen, müssen wir etwas effizienteres finden. Meine nächste Lösung war ungefähr so:
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
Wir möchten jedoch, dass Benutzer denselben Fragebogen zweimal beantworten können, damit sie möglicherweise zwei Antworten auf Frage 1 in der Antworttabelle haben.
Also, jetzt bin ich ratlos. Wie kann man das am besten angehen? Vielen Dank!
quelle
Ich mag die Join-Methode selbst:
Update Nach dem Testen mit einer größeren Tabelle (~ 1 Million Zeilen) dauerte diese Methode erheblich länger als die
OR
in der ursprünglichen Frage erwähnte einfache Methode.quelle
Wir haben
user_id
dieanswers
Tabelle in einer Reihe von Verknüpfungen verknüpft, um Daten aus anderen Tabellen abzurufen, aber das Isolieren der SQL-Antworttabelle und das Schreiben in so einfachen Begriffen haben mir geholfen, die Lösung zu finden:Wir haben unnötigerweise eine zweite Unterabfrage verwendet.
quelle
Wenn Sie eine große Datenmenge haben, würde ich zwei Indizes erstellen:
Aufgrund der Art und Weise, wie die Daten organisiert sind, müssen Sie mehrfach beitreten. Wenn Sie wissen, welcher Wert für welche Frage am wenigsten verbreitet ist, können Sie die Abfrage möglicherweise etwas beschleunigen, der Optimierer sollte dies jedoch für Sie tun.
Versuchen Sie die Abfrage als:
Tabelle a1 sollte den ersten Index verwenden. Abhängig von der Datenverteilung verwendet der Optimierer möglicherweise einen der Indizes. Die gesamte Abfrage sollte aus den Indizes befriedigt werden.
quelle
Eine Möglichkeit, dies zu erreichen, besteht darin, eine Teilmenge von user_id abzurufen und diese für die zweite Übereinstimmung zu testen:
Verwenden der Rolando-Struktur:
Erträge:
quelle