Lubię podchodzić do tego za pomocą group by
i 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;
Alternatywą jest join
. Jeśli nie ma zduplikowanych wartości dla 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
Metoda ma zaletę skalowalności i wyrażalności. Łatwo jest wyrazić wiele warunków (kolor nie jest czerwony, wyprodukowany w USA lub Chinach), które nie są zwykłą równością. Również dodatkowe warunki mają bardzo podobną wydajność.
Drugi prawdopodobnie działa lepiej (z odpowiednimi indeksami) w kilku warunkach.