Ich nähere mich diesen gerne mit group by
und 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;
Eine Alternative ist ein join
. Wenn es keine doppelten Werte für eine id
gibt :
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';
Die group by
Methode hat den Vorteil der Skalierbarkeit und Ausdrückbarkeit. Es ist einfach, viele Bedingungen (Farbe ist nicht rot, hergestellt in den USA oder China) auszudrücken, die keine einfache Gleichheit sind. Außerdem haben zusätzliche Bedingungen eine sehr ähnliche Leistung.
Der zweite schneidet wahrscheinlich unter einigen Bedingungen besser ab (mit den richtigen Indizes).