Saya suka mendekati ini menggunakan group by
dan having
:
select id
from t
where (meta_key = 'color' and meta_value = 'red') or
(meta_key = 'price' and meta_value = '10')
group by id
having count(distinct meta_key) = 2;
Alternatifnya adalah join
. Jika tidak ada nilai duplikat untuk id
:
select id
from t tc join
t tp
on tc.id = tp.id and
tc.meta_key = 'color' and tc.meta_value = 'red' and
tp.meta_key = 'price' and tp.meta_value = '10';
group by
metode memiliki keunggulan skalabilitas dan ekspresibilitas. Sangat mudah untuk mengekspresikan banyak kondisi (warna tidak merah, diproduksi di AS atau Cina) yang bukan persamaan sederhana. Selain itu, kondisi tambahan memiliki kinerja yang sangat mirip.
Yang kedua mungkin berkinerja lebih baik (dengan indeks yang tepat) pada beberapa kondisi.