表结构如下
class_id       object_id     property_id    value
1001           1             1              aaa
1001           1             2              bbb
1001           1             3              ccc
1001           2             1              eee
1001           2             2              fff
1002           2             1              eee
1003           2             2              fff
1003           2             3              ggg
我需要一个多条件查询,比如查询出满足条件class_id=1001 and ((property_id=1 and value=aaa) and (property_id=2 and value=bbb)) 的object_id注:表示可以接着加任意条件

解决方案 »

  1.   

    select object_id
    from 表结构如下 t
    where class_id=1001=1001 and property_id=1 and value='aaa'
    And exists (select 1 from 表结构如下 where class_id=1001=1001 and property_id=2 and value='bbb')
    and exists (select 1 from 表结构如下 where class_id=1001=1001 And property_id=3 and value='ccc')
      

  2.   

    查询结果不对,这样写的话满足class_id=1001 and property_id=1 and value='aaa'
    的结果都出来了
      

  3.   

    class_id=1001 and ((property_id=1 and value=aaa) and (property_id=2 and value=bbb))
    应该是or吧
      

  4.   

    class_id=1001 and【这个肯定是and】 ((property_id=1 and value=aaa) and【这个可以是and或or】(property_id=2 and value=bbb))
      

  5.   

    select object_id
    from 表结构如下 t
    where class_id=1001=1001 and property_id=1 and value='aaa'
    And exists (select 1 from 表结构如下 where object_id=t.object_id and class_id=1001=1001 and property_id=2 and value='bbb')
    and exists (select 1 from 表结构如下 where object_id=t.object_id and class_id=1001=1001 And property_id=3 and value='ccc')
      

  6.   

    谢谢ACMAIN_CHM,这语句写对了,而且也非常适合并凑条件。缺点就是效率低了点,100条记录的表中查询花了0.03秒。这个表的数据量肯定会上百万的,不知到时候能不能忍受1小时后结贴,如果有任何建议请回复,谢谢
      

  7.   

    在class_id、object_id、property_id、value上建立复合索引,
      

  8.   

    or
    SELECT a.* from tz a
    left join ttz b on (b.object_id=a.object_id and b.class_id=1001 and b.property_id=2 and b.value='bbb')
    left join ttz c on (c.object_id=a.object_id and c.class_id=1001 and c.property_id=3 and c.value='ccc')
     where a.class_id=1001 and a.property_id=1 and a.value='aaa' and c.object_id is not null and b.object_id is not null
      

  9.   

    将LEFT JOIN->INNER JOIN
    SELECT a.* from tTz a
    INNER join ttz b on (b.object_id=a.object_id and b.class_id=1001 and b.property_id=2 and b.value='bbb')
    INNER join ttz c on (c.object_id=a.object_id and c.class_id=1001 and c.property_id=3 and c.value='ccc')
     where a.class_id=1001 and a.property_id=1 and a.value='aaa' 
      

  10.   

    用 left join 确实快了很多,但是这样写的话,如何写OR的条件呢?
    比如这两个条件是OR的
    left join ttz b on (b.object_id=a.object_id and b.class_id=1001 and b.property_id=2 and b.value='bbb')
    left join ttz c on (c.object_id=a.object_id and c.class_id=1001 and c.property_id=3 and c.value='ccc')
      

  11.   

    在WHERE 中,
     where a.class_id=1001 and a.property_id=1 and a.value='aaa' 
    and (c.object_id is not null or b.object_id is not null)假设只要满足1个条件即可
      

  12.   

    SELECT a.* from v_object a
    INNER join v_object b on (b.object_id=a.object_id and b.class_id=1001 and b.property_id=1 and b.value='张三')
    INNER join v_object c on (c.object_id=a.object_id and c.class_id=1001 and c.property_id=2 and c.value='男')
     where a.class_id=1001  and ( c.object_id is not null or b.object_id is not null)试了一下,并不能查询出满足property_id=1 and b.value='张三' 或property_id=2 and c.value='男'的记录
      

  13.   

    贴你的记录,如果 是或,不能用INNER JOIN,要用LEFT JOIN+WHERE,参考11楼
      

  14.   

    用LEFT JOIN可以了,谢谢两位