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.