完全に含まれるサブセットを識別するために、SQLクエリ

StackOverflow https://stackoverflow.com/questions/2425584

  •  19-09-2019
  •  | 
  •  

質問

私は、次の質問に対する解決策を見つけ出すために私の頭を悩まています:

私は2つのフィールド、USER_IDとCLIENT_IDを持つテーブルがあります。各USER_ID用のN CLIENT_IDsに1があります。

私たちは、そのユーザAが、私はまた、これらのクライアントのすべてにリンクされている他のユーザーを返すクエリを構築するクライアント1,2及び3にリンクされているとしましょう。彼らはより多くのクライアントに連結することができるが、それらは、ユーザAのすべてのクライアントへのリンクを持っている必要があります。

例:ユーザーBは、クライアント1,2,3,4へのリンクがあります。ユーザCは、クライアント1,2へのリンクがあります。ユーザーBがユーザーAのすべてのクライアントへのリンクを持っているため、クエリは、ユーザBを返す必要があります。彼は唯一のユーザーAのクライアントのいくつかのすべてではないにリンクしているため、ユーザCは、返却すべきではありません。

これは、一見シンプルな問題のように思えるが、私は私の人生のために私の制約を満たすクエリを思い付くことができません。私を助けることができる経験豊富なSQLの達人はありますか?

役に立ちましたか?

解決

名前とデータ型仮定の数を作る...

DECLARE
  @UserId  int
 ,@ClientCount  int

DECLARE @Clients as table
 (ClientId  int  not null)

--  All clients for the "target" user
INSERT @Clients
 select Clientid
 from MyTable
 where UserId = @userId

--  Track how many there are
SET @ClientCount = @@rowcount

--  List all users that have those clients
SELECT mt.UserId, count(*) HowMany
 from Mytable mt
  inner join @Clients cl
   on cl.ClientId = mt.Clientid
 where UserId <> @UserId
 group by mt.UserId
 having count(*) = @ClientCount

私はこれに対してをテストするために、テーブルを持っていないが、それは少しデバッグで動作するはずです。

他のヒント

SELECT uc.user_id, u.username, COUNT(*) as client_count
FROM user u
INNER JOIN user_client uc
USING (user_id)
WHERE uc.client_id IN (
  SELECT client_id
  FROM   user_client
  WHERE  user_id = {ID of user A}
)
GROUP BY uc.user_id, u.username
HAVING client_count = (
  SELECT COUNT(*)
  FROM   user_client
  WHERE  user_id = {ID of user A}
)

このようなテストされていないと、おそらくMySQLの特定の何かが動作するはずです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top