有一张中间表,两个字段projectId,appId
projectId            appId
    p1                 a1
    p2                 a1
    p2                 a2
    p2                 a3
    p3                 a1
    p3                 a2要求根据已知的appId(比如a1,a2)查询出只包含该appId集合的porjectId,小弟在此请教这个sql该怎么写啊?

解决方案 »

  1.   

    select *
    from 中间表 a
    where not exists (select 1 from 中间表 where projectId=a.projectId and appId !='a1' or appId !='a2');
      

  2.   

    得不到结果啊,还有第二个select后面为什么跟的是1?
      

  3.   

    写错了,OR改成AND
    select *
    from t_RichardQi a
    where not exists (select 1 from t_RichardQi where projectId=a.projectId and appId !='a1' and appId !='a2');或者select *
    from t_RichardQi a
    where not exists (select 1 from t_RichardQi where projectId=a.projectId and appId not in ('a1','a2'));
      

  4.   

    mysql> select * from t_RichardQi;
    +-----------+-------+
    | projectId | appId |
    +-----------+-------+
    | p1        | a1    |
    | p2        | a1    |
    | p2        | a2    |
    | p2        | a3    |
    | p3        | a1    |
    | p3        | a2    |
    +-----------+-------+
    6 rows in set (0.00 sec)mysql>
    mysql> select *
        -> from t_RichardQi a
        -> where not exists (select 1 from t_RichardQi where projectId=a.projectId a
    nd appId !='a1' and appId !='a2');
    +-----------+-------+
    | projectId | appId |
    +-----------+-------+
    | p1        | a1    |
    | p3        | a1    |
    | p3        | a2    |
    +-----------+-------+
    3 rows in set (0.00 sec)mysql> select *
        -> from t_RichardQi a
        -> where not exists (select 1 from t_RichardQi where projectId=a.projectId a
    nd appId not in ('a1','a2'));
    +-----------+-------+
    | projectId | appId |
    +-----------+-------+
    | p1        | a1    |
    | p3        | a1    |
    | p3        | a2    |
    +-----------+-------+
    3 rows in set (0.00 sec)mysql>
      

  5.   

    完全相等:
    select distinct projectid
    from test a
    where a.appid in('a1','a2') and
    2=(select count(distinct appid) from test where projectid=a.projectid)
      

  6.   

    查询结果离目标近了,我想我没描述清楚,应该是只查出p3才对,我要完全且只包含a1和a2两个appId的projectId
      

  7.   

    zhoupuyue的方法是对的而且扩展性更好,谢谢啦
      

  8.   

    现在经过多次试验发现zhoupuyue的方法有问题。。
    将ACMAIN_CHM的方法增加group by projectId和 having count(*)=2就正确了,谢谢两位了