Mi piace avvicinarmi a questi 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;
Un'alternativa è un join
. Se non ci sono valori duplicati per un 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';
Il group by
metodo ha il vantaggio di scalabilità ed esprimibilità. È facile esprimere molte condizioni (il colore non è rosso, prodotto negli Stati Uniti o in Cina) che non sono una semplice uguaglianza. Inoltre, condizioni aggiuntive hanno prestazioni molto simili.
Il secondo probabilmente si comporta meglio (con gli indici giusti) in un paio di condizioni.