我有这样的表:
id | meta_key | meta_value
-------------
1 | color | red
1 | price | 10
2 | color | red
2 | price | 20
3 | color | blue
3 | price | 10
如何获得所有唯一ID,颜色=红色,价格= 10。我可以通过单个简单查询,没有枢轴等来获得它。
答案 0 :(得分:3)
我喜欢使用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
方法具有可扩展性和可表达性的优势。很容易表达不是简单平等的许多条件(颜色不是红色,在美国或中国制造)。此外,附加条件具有非常相似的性能。
第二个可能在几个条件下表现更好(使用正确的索引)。