Eu gosto de abordá-los usando
group by
e 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;
Uma alternativa é um
join
. Se não houver valores duplicados para um 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';
O
group by
tem a vantagem de escalabilidade e expressibilidade. É fácil expressar muitas condições (a cor não é vermelha, fabricada nos EUA ou na China) que não são simples igualdade. Além disso, as condições adicionais têm desempenho muito semelhante. O segundo provavelmente tem um desempenho melhor (com os índices certos) em algumas condições.