-- sample table for discussion
CREATE TABLE tbl
(id int, groupid varchar(2), memberid varchar(2));
INSERT INTO tbl
(id, groupid, memberid)
VALUES
(6, 'g4', 'm1'),
(7, 'g4', 'm2'),
(8, 'g6', 'm1'),
(9, 'g6', 'm3'),
(1, 'g1', 'm1'),
(2, 'g1', 'm2'),
(3, 'g2', 'm1'),
(4, 'g2', 'm2'),
(5, 'g2', 'm3')
;
-- the query
select a.groupid, b.groupid peer
from (select groupid, count(*) member_count, min(memberid) x, max(memberid) y
from tbl
group by groupid) A
join
(select groupid, count(*) member_count, min(memberid) x, max(memberid) y
from tbl
group by groupid) B
on a.groupid<b.groupid and a.member_count=b.member_count and a.x=b.x and a.y=b.y
join tbl A1
on A1.groupid = A.groupid
join tbl B1
on B1.groupid = B.groupid and A1.memberid = B1.memberid
group by A.groupid, b.groupid, A.member_count
having count(1) = A.member_count;
-- the result
GROUPID PEER
g1 g4
上記はgroups
、非常に最適な方法で、同業者にリストされる方法を示しています。グループをメンバー数に分解し、最小値と最大値を取得することにより、大規模なデータベースでうまく機能します。グループは直接結合を使用して迅速に切り捨てられ、残りの一致についてのみ、グループ ID A と B で結合された完全なテーブルが参照され、それらが同等のグループであるかどうかが最終的に判断されます。
3 つの類似グループ (101,103,104) がある場合、セットは 3 つの別個の行 (101,103)、(101,104)、(103,104) として表示されます。各ペアがピアリングを形成するため、そのようなクエリは、いずれかが既にわかっている場合に最適に使用されます。ピアを見つけたいグループ。このフィルターは、最初のサブクエリに適合します。