Tôi muốn tiếp cận chúng bằng cách sử dụng nhóm group by
và 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;
Một lựa chọn thay thế là join
. Nếu không có giá trị trùng lặp nào cho một 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';
Nhóm group by
phương pháp này có lợi thế về khả năng mở rộng và khả năng diễn đạt. Có thể dễ dàng thể hiện nhiều điều kiện (màu không đỏ, sản xuất tại Mỹ hoặc Trung Quốc) không đơn giản là bình đẳng. Ngoài ra, các điều kiện bổ sung có hiệu suất rất giống nhau.
Thứ hai có thể hoạt động tốt hơn (với các chỉ mục phù hợp) trên một số điều kiện.