2

次のmysqlテーブルがあります:

id     |  member     |
1      | abc       
1      | pqr   
2      | xyz   
3      | pqr   
3      | abc 

特定の ID とまったく同じメンバーを持つ ID を返すクエリを作成しようとしています。たとえば、指定された ID が 1 の場合、ID 1 と ID 3 の両方がまったく同じメンバーを持っているため、クエリは 3 を返す必要があります。{abc, pqr}. ポインタはありますか?感謝します。

編集:テーブルには重複がある可能性があります。たとえば、ID 3 には {pqr, abc} ではなく {abc, abc} というメンバーが含まれる場合があります。この場合、クエリは ID 3 を返すべきではありません。

4

3 に答える 3

1

これは、テーブル全体に一致するペアを見つけるソリューションです。必要に応じて、where句を追加してフィルタリングできます。基本的に、等しい「メンバー」と等しくない「id」に基づいて自己結合を行います。次に、2つのIDでグループ化された結果のカウントを比較し、それらを元のテーブルのIDの合計カウントと比較します。両方が一致する場合、それはそれらがまったく同じメンバーを持っていることを意味します。

select
    t1.id, t2.id
from
    table t1
    inner join table t2
        on  t1.member = t2.member
            and t1.id < t2.id
    inner join (select id, count(1) as cnt from table group by id) c1
        on  t1.id = c1.id
    inner join (select id, count(1) as cnt from table group by id) c2
        on  t2.id = c2.id
group by
    t1.id, t2.id, c1.cnt, c2.cnt
having
    count(1) = c1.cnt
    and count(1) = c2.cnt
order by 
    t1.id, t2.id

これは私が使用したサンプルデータで、(1,3)と(6,7)の一致を返しました。

insert into table
values 
    (1, 'abc'), (1, 'pqr'), (2, 'xyz'), (3, 'pqr'), (3, 'abc'), (4, 'abc'), (5, 'pqr'),
    (6, 'abc'), (6, 'def'), (6, 'ghi'), (7, 'abc'), (7, 'def'), (7, 'ghi')
于 2012-07-18T14:39:53.407 に答える
0

サブクエリを使用した同様の(Derek Krommの)アプローチ:

SELECT id
FROM mc a
WHERE
  id != 1 AND
  member IN (
    SELECT member FROM mc WHERE id=1)
GROUP BY id
HAVING
  COUNT(*) IN (
    SELECT COUNT(*) FROM mc WHERE id=1) AND
  COUNT(*) IN (
    SELECT COUNT(*) FROM mc where id=a.id);

ここでのロジックは、次の 2 つの条件に一致するすべての ID が必要です。

  • member は id 1 に属するメンバーです
  • メンバーの総数は、ID 1 に属するメンバーの数と同じです
  • 現在の ID のメンバーの総数と等しい、選択されたメンバーの総数
于 2012-07-18T15:12:18.220 に答える
0

これを試して:

declare @id int
set @id=1
select a.id from
(select id,COUNT(*) cnt from sample_table
where member in (select member from sample_table where id=@id)
and id <>@id
group by id)a
join
(select count(distinct member) cnt from sample_table where id=@id)b
on a.cnt=b.cnt
于 2012-07-18T14:42:37.613 に答える