Rád k nim přistupuji pomocí group by
a 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;
Alternativou je join
. Pokud pro id
neexistují žádné duplicitní hodnoty :
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
Tato metoda má výhodu škálovatelnosti a vyjadřitelnosti. Je snadné vyjádřit mnoho podmínek (barva není červená, vyrobeno v USA nebo Číně), které nejsou jednoduchou rovností. Také další podmínky mají velmi podobný výkon.
Druhý pravděpodobně funguje lépe (se správnými indexy) za několika podmínek.