sql >> Base de Datos >  >> RDS >> Mysql

Construya una consulta MySQL (tabla meta_key/meta_value)

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.