Ik benader deze graag met behulp van group by
en 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;
Een alternatief is een join
. Als er geen dubbele waarden zijn voor een 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';
De group by
methode heeft het voordeel van schaalbaarheid en uitdrukbaarheid. Het is gemakkelijk om veel voorwaarden uit te drukken (kleur is niet rood, vervaardigd in de VS of China) die geen eenvoudige gelijkheid zijn. Aanvullende voorwaarden hebben ook zeer vergelijkbare prestaties.
De tweede presteert waarschijnlijk beter (met de juiste indexen) onder een aantal voorwaarden.