我想要一个查询,它将找到一个由正在查询的成员组成的组。此外,成员可以有别名。
我有两张桌子:
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
答案 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))