Jeg kan godt lide at nærme mig disse ved at bruge group by
og 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;
Et alternativ er en join
. Hvis der ikke er nogen duplikerede værdier for et 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 fordelen af skalerbarhed og udtryksevne. Det er let at udtrykke mange forhold (farven er ikke rød, fremstillet i USA eller Kina), som ikke er simpel lighed. Yderligere betingelser har også meget lignende ydeevne.
Den anden klarer sig sandsynligvis bedre (med de rigtige indekser) på et par forhold.