Mysql
 sql >> Base de données >  >> RDS >> Mysql

Construire une requête MySQL (table meta_key/meta_value)

J'aime les approcher en utilisant group by et 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;

Une alternative est une join . S'il n'y a pas de valeurs en double pour 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';

Le group by La méthode a l'avantage de l'évolutivité et de l'expressibilité. Il est facile d'exprimer de nombreuses conditions (la couleur n'est pas rouge, fabriqué aux États-Unis ou en Chine) qui ne sont pas une simple égalité. De plus, les conditions supplémentaires ont des performances très similaires.

Le second fonctionne probablement mieux (avec les bons index) sous quelques conditions.