2

次の構造のMySQLテーブルがあります。

ここに画像の説明を入力してください

uids(または単一uid)のグループを受け取り、特定のmidの下の閉じたグループにそれらが存在するかどうかを確認するクエリが必要です。それらが存在する場合、クエリはmidそれらが存在する下を返す必要があります。たとえば、上の表では次のようになります。

('chuks.obima', 'crackhead') should return '2
('vweetah','crackhead') should return '1'
('vweetah','crackhead','chuks.obima') should return 3
('crackhead') should return an empty result
4

3 に答える 3

4

次のようなものが必要だと思います:

SELECT mid
FROM your_table
WHERE uid in ('favour','crackhead','charisma')
GROUP BY mid
HAVING COUNT(*)=3

編集: 2番目の例に基づいて、これはあなたが探しているものです:

SELECT mid
FROM your_table
WHERE uid in ('vweetah', 'crackhead')
GROUP BY mid
HAVING
  COUNT(distinct uid)=
  (select count(*)
   from (select 'vweetah' union select 'crackhead') s)

または、最後のサブクエリを探している要素の数に置き換えることができます。HAVING COUNT(distinct uid) = 2

EDIT2:今、あなたが探しているものを正確に理解しています。これにより、正しい結果が得られるはずです。

SELECT your_table.mid, s.tot_count, count(distinct uid)
FROM
  your_table inner join
  (select mid, seq, count(distinct uid) tot_count from your_table group by mid, seq) s
  on your_table.mid = s.mid and your_table.seq=s.seq
WHERE your_table.uid in ('crackhead')
GROUP BY your_table.mid
HAVING COUNT(distinct uid)=s.tot_count AND COUNT(distinct uid)=1

最後のカウントは、探している要素の数と同じです。これは次のように簡略化できます。

SELECT your_table.mid
FROM your_table
GROUP BY your_table.mid
HAVING
  count(distinct uid)=
  count(distinct case when your_table.uid in ('vweetah','crackhead','chuks.obima') then your_table.uid end)
  and count(distinct uid)=3

すべての uid が同じの下にある場合にグループが閉じていると見なされる場合は、seqgroup by を次のように変更しgroup by your_table.mid, your_table.seq、select を次のように変更する必要があります。SELECT distinct your_table.mid

于 2012-11-27T22:39:52.723 に答える
2

それがクローズド グループであることを確認するには、COUNT()そのグループの合計メンバーの集計を取得し、midそれをリスト内の人数と比較します。それらが等しい場合、それは閉じています。

1以下は、3 人全員がグループに属しており、グループ内の合計人数も 3 である場合に a を返します。

SELECT
  (((SELECT COUNT(*) FROM yourtable WHERE `uid` IN ('favour','crackhead','charisma') AND `mid` = 2) 
  =
  (SELECT COUNT(*) FROM yourtable WHERE `mid` = 2)) 
  AND (SELECT COUNT(*) FROM yourtable WHERE `mid` = 2) = 3) AS group_is_closed

mid2回カウントしないように、サブクエリでラップします。

SELECT
  /* 3 is the number of uid you are looking for */
  (mid_count = 3 AND mid_count = member_count) AS group_is_closed
FROM (
  SELECT
   /* Find how many of your uids are in the `mid` */
   (SELECT COUNT(*) FROM yourtable WHERE `uid` IN ('favour','crackhead','charisma') AND `mid` = 2) AS member_count,
   /* Find the total number of uids in the `mid` */
   (SELECT COUNT(*) FROM yourtable WHERE `mid` = 2) AS mid_count
) subq

SQLFiddle のデモ (別名、うわー、実際に動作します):

  • 肯定的な結果(選択した 3 つだけが にありmid、1 を返します)
  • 否定的な結果(3 に含まれていないユーザーも に含まれているmid場合、0 を返します)
  • 否定的な結果 2 (3 人のユーザーのうちの 1 人が にいないmid0 を返す)
于 2012-11-27T21:25:45.787 に答える
2

これを試して:

SELECT mid
FROM your_table
WHERE uid in ('favour','crackhead','charisma')
GROUP BY mid
HAVING COUNT(DISTINCT uid) = 3
于 2012-12-09T07:24:30.990 に答える