Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Construir consulta MySQL (tabela meta_key/meta_value)


Eu gosto de abordá-los 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;

Uma alternativa é um join . Se não houver valores duplicados para um 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';

O group by tem a vantagem de escalabilidade e expressibilidade. É fácil expressar muitas condições (a cor não é vermelha, fabricada nos EUA ou na China) que não são simples igualdade. Além disso, as condições adicionais têm desempenho muito semelhante.

O segundo provavelmente tem um desempenho melhor (com os índices certos) em algumas condições.