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

时间:2014-02-26 01:44:49

标签: sql sqlite

我想要一个查询,它将找到一个由正在查询的成员组成的组。此外,成员可以有别名。

我有两张桌子:

CREATE TABLE Alias(
    id    VARCHAR(40),
    alias VARCHAR(40)
);

CREATE TABLE Group(
    group_id  VARCHAR(40),
    member_id VARCHAR(40)
);

Alias:
1 4
2 5
3 6

Group:
10 1
10 4
10 5
11 2
11 6
12 2
13 1
13 2
13 3

这些是示例查询和结果

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

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

1 个答案:

答案 0 :(得分:1)

这就像set-within-sets查询一样,带有别名的额外复杂性。我喜欢使用带有group by子句的having来解决这些问题。

以下是查询:

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))