Jag gillar att närma mig dessa med group by
och 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;
Ett alternativ är en join
. Om det inte finns några dubbletter av värden för ett 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
Metoden har fördelen av skalbarhet och uttryckbarhet. Det är lätt att uttrycka många förhållanden (färgen är inte röd, tillverkad i USA eller Kina) som inte är enkel jämlikhet. Ytterligare villkor har också mycket liknande prestanda.
Den andra presterar förmodligen bättre (med rätt index) på ett par villkor.