Me gusta abordarlos usando group by
y 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;
Una alternativa es join
. Si no hay valores duplicados para 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';
El group by
El método tiene la ventaja de la escalabilidad y la expresibilidad. Es fácil expresar muchas condiciones (el color no es rojo, fabricado en EE. UU. o China) que no son una simple igualdad. Además, las condiciones adicionales tienen un rendimiento muy similar.
El segundo probablemente se desempeñe mejor (con los índices correctos) en un par de condiciones.