我有一张表,其中包含来自另一个表的信息的元数据。元数据表看起来像这样(我删除了相关的ID,所以它更明显):
id entry_id property value
1 12 color blue
2 12 shape circle
3 13 color red
4 13 shape circle
5 14 color blue
6 14 shape square
7 15 material stone
8 12 material plastic
现在我想在此表中搜索属性,例如选择颜色 蓝色的所有条目:
select entry_id from table where property = 'color' and value = 'blue'
到目前为止,这么好。但是,当我有多个条件时,如何扩展查询?例如,我想搜索颜色 蓝色且形状 圈的所有条目。现在,我将通过工会实现这一目标:
select entry_id from table where property = 'color' and value = 'blue'
union
select entry_id from table where property = 'shape' and value = 'circle'
这显然让我想要查找的属性越来越难看。而且我认为它也不是很快。是否有更优雅的方式来做到这一点?这个表的原因是,我有包含元数据的对象,可以由用户设置。
谢谢!
答案 0 :(得分:1)
这是你要找的?
select
distinct e1.entry_id
from
table e1
inner join
table e2 on e1.entry_id=e2.entry_id
where
e1.property='color' and
e1.value='blue' and
e2.property='shape' and
e2.value='circle'
答案 1 :(得分:0)
SELECT a.entry_id
FROM table a INNER JOIN table b USING (entry_id)
WHERE a.property = 'color' AND a.value = 'blue'
AND b.property = 'shape' AND b.value = 'circle'
答案 2 :(得分:0)
您可以欺骗MySQL构建哈希表,而不是union
或or
:
select distinct
entry_id
from
table t
inner join
(select 'shape' as property, 'circle' as value
union all
select 'color' as property, 'blue' as value) s on
t.property = s.property
and t.value = s.value
您还可以尝试exists
:
select distinct
entry_id
from
table t
where
exists (select 1 from
(select 'shape' as property, 'circle' as value
union all
select 'color' as property, 'blue' as value) s
where
s.property = t.property
and s.value = t.value)
使用这两种方法中的一种,您可以通过简单地将另一个union all
添加到s
子查询来追加与您的小心愿相关的搜索条件。