Обичам да подхождам към тях с помощта на group by
и 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;
Алтернатива е join
. Ако няма дублиращи се стойности за 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';
group by
методът има предимството на мащабируемост и изразимост. Лесно е да се изразят много условия (цветът не е червен, произведен в САЩ или Китай), които не са просто равенство. Освен това допълнителните условия имат много сходна производителност.
Вторият вероятно се представя по-добре (с правилните индекси) при няколко условия.