4

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

USER_IDとCLIENT_IDの2つのフィールドを持つテーブルがあります。USER_IDごとに、1からn個のCLIENT_IDがあります。

ユーザーAがクライアント1、2、および3にリンクされているとしましょう。これらすべてのクライアントにリンクされている他のユーザーを返すクエリを作成します。より多くのクライアントにリンクされている可能性がありますが、ユーザーAのすべてのクライアントにリンクしている必要があります。

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

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

4

2 に答える 2

3

いくつかの名前とデータ型の仮定を行う...

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

これをテストするためのテーブルはありませんが、デバッグはほとんど必要ありません。

于 2010-03-11T15:22:22.977 に答える
2
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固有ですが、このようなものは機能するはずです。

于 2010-03-11T14:18:53.877 に答える