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.