Kami memiliki tabel yang kami gunakan untuk menyimpan jawaban atas pertanyaan. Kami harus dapat menemukan pengguna yang memiliki jawaban tertentu untuk pertanyaan tertentu. Jadi, jika tabel kami terdiri dari data berikut:
user_id question_id answer_value
Sally 1 Pooch
Sally 2 Peach
John 1 Pooch
John 2 Duke
dan kami ingin menemukan pengguna yang menjawab 'Pooch' untuk pertanyaan 1 dan 'Peach' untuk pertanyaan 2, SQL berikut ini (jelas) tidak akan berfungsi:
select user_id
from answers
where question_id=1
and answer_value = 'Pooch'
and question_id=2
and answer_value='Peach'
Pikiran pertama saya adalah bergabung sendiri di meja untuk setiap jawaban yang kami cari:
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'
Ini berfungsi, tetapi karena kami mengizinkan jumlah filter pencarian yang sewenang-wenang, kami perlu menemukan sesuatu yang jauh lebih efisien. Solusi saya berikutnya adalah sesuatu seperti ini:
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
Namun, kami ingin pengguna dapat mengambil kuesioner yang sama dua kali, sehingga mereka berpotensi memiliki dua jawaban untuk pertanyaan 1 di tabel jawaban.
Jadi, sekarang saya bingung. Apa cara terbaik untuk mendekati ini? Terima kasih!
sumber
Saya suka metode bergabung, sendiri:
Pembaruan Setelah menguji dengan tabel yang lebih besar (~ 1 juta baris), metode ini memakan waktu lebih lama dari
OR
metode sederhana yang disebutkan dalam pertanyaan awal.sumber
Kami bergabung dengan
user_id
darianswers
tabel dalam rantai bergabung untuk mendapatkan data dari tabel lain, tetapi mengisolasi tabel jawaban SQL dan menulisnya dalam istilah sederhana seperti itu membantu saya menemukan solusinya:Kami tidak perlu menggunakan sub-permintaan kedua.
sumber
Jika Anda memiliki satu set data yang besar, saya akan melakukan dua indeks:
Anda harus bergabung beberapa kali karena cara pengorganisasian data. Jika Anda tahu nilai pertanyaan mana yang paling tidak umum, Anda mungkin dapat sedikit mempercepat kueri, tetapi pengoptimal harus melakukannya untuk Anda.
Coba kueri sebagai:
Tabel a1 harus menggunakan indeks pertama. Bergantung pada distribusi data, pengoptimal dapat menggunakan indeks mana pun. Seluruh permintaan harus dipenuhi dari indeks.
sumber
Salah satu cara untuk mendekatinya adalah dengan mendapatkan subset dari user_id dan menguji mereka untuk kecocokan kedua:
Menggunakan struktur Rolando:
Hasil:
sumber