Mamy tabelę, której używamy do przechowywania odpowiedzi na pytania. Musimy być w stanie znaleźć użytkowników, którzy mają określone odpowiedzi na określone pytania. Jeśli więc nasza tabela składa się z następujących danych:
user_id question_id answer_value
Sally 1 Pooch
Sally 2 Peach
John 1 Pooch
John 2 Duke
i chcemy znaleźć użytkowników, którzy odpowiedzą na „Pooch” w przypadku pytania 1 i „Peach” w przypadku pytania 2, następujący kod SQL (oczywiście) nie będzie działać:
select user_id
from answers
where question_id=1
and answer_value = 'Pooch'
and question_id=2
and answer_value='Peach'
Moją pierwszą myślą było przyłączyć się do stołu dla każdej szukanej odpowiedzi:
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'
Działa to, ale ponieważ zezwalamy na dowolną liczbę filtrów wyszukiwania, musimy znaleźć coś znacznie wydajniejszego. Moje następne rozwiązanie wyglądało mniej więcej tak:
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
Chcemy jednak, aby użytkownicy mogli dwa razy wypełnić ten sam kwestionariusz, aby potencjalnie mieli dwie odpowiedzi na pytanie 1 w tabeli odpowiedzi.
Więc teraz jestem zagubiony. Jak najlepiej to podejść? Dzięki!
źródło
Lubię metodę dołączania, ja sam:
Aktualizacja Po przetestowaniu z większą tabelą (~ 1 milion wierszy) ta metoda zajęła znacznie więcej czasu niż prosta
OR
metoda wspomniana w pierwotnym pytaniu.źródło
Łączyliśmy się
user_id
zanswers
tabeli w łańcuchu złączeń, aby uzyskać dane z innych tabel, ale izolowanie SQL tabeli odpowiedzi i pisanie jej w tak prostych terminach pomogło mi znaleźć rozwiązanie:Niepotrzebnie korzystaliśmy z drugiego zapytania częściowego.
źródło
Jeśli masz duży zestaw danych, zrobiłbym dwa indeksy:
Musisz dołączyć wiele razy ze względu na sposób organizacji danych. Jeśli wiesz, dla której wartości pytanie jest najmniej powszechne, możesz nieco przyspieszyć zapytanie, ale optymalizator powinien to zrobić za Ciebie.
Wypróbuj zapytanie jako:
Tabela a1 powinna używać pierwszego indeksu. W zależności od dystrybucji danych optymalizator może użyć dowolnego indeksu. Całe zapytanie powinno być spełnione z indeksów.
źródło
Jednym ze sposobów podejścia jest uzyskanie podzbioru identyfikator_użytkownika i przetestowanie go pod kątem drugiego dopasowania:
Korzystanie ze struktury Rolando:
Wydajność:
źródło