MySQL:多次搜索单个表?

时间:2009-08-14 13:09:26

标签: mysql search

我有一张表,其中包含来自另一个表的信息的元数据。元数据表看起来像这样(我删除了相关的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'

这显然让我想要查找的属性越来越难看。而且我认为它也不是很快。是否有更优雅的方式来做到这一点?这个表的原因是,我有包含元数据的对象,可以由用户设置。

谢谢!

3 个答案:

答案 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构建哈希表,而不是unionor

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子查询来追加与您的小心愿相关的搜索条件。