如何构造查询以获取一组成员的组 ID



我想要一个查询,该查询将找到一个完全由所查询的成员组成的组。此外,成员可以有别名。

我有两个表:

创建表别名(    id 瓦尔查尔(40),    别名瓦尔查尔(40));创建表组(    group_id 瓦尔查尔(40),    member_id瓦尔查尔(40));别名:1 42 53 6群:10 110 410 511 211 612 213 113 213 3

这些是示例查询和结果

Query('1')           : NULL
Query('1', '2')      : '10' 
Query('5', '3')      : '11' 
Query('4', '5', '6') : '13' 

SQLFiddle: http://sqlfiddle.com/#!7/ab3ac

这类似于集合中的集合查询,具有别名的额外复杂性。 我喜欢使用带有having子句的group by来解决这些问题。

下面是查询:

select g.group_id
from `group` g left outer join
     (select id, alias
      from alias a
      union
      select alias, id
      from alias
     ) a
     on g.member_id = a.alias
group by g.group_id
having sum(g.member_id = '4' or a.id = '4') > 0 and
       sum(g.member_id = '5' or a.id = '5') > 0 and
       sum(g.member_id = '6' or a.id = '6') > 0 and
       count(distinct coalesce(min(a.id, a.alias), g.member_id)) = 3;

having子句中的前三个条件针对您关心的每个值进行测试。 查询通过使用别名子句中的union在两个方向上查找别名。

复杂的count()表达式旨在计算不同对的数量。 使用别名中的最小值对别名进行计数。 这适用于问题中的四种情况。 您可能实际上想要这个count()表达式:

count(distinct min(a.id, a.alias, g.member_id))

最新更新