2010-03-11 28 views
4

我抓我的頭找出解決以下問題:SQL查詢來識別完全包含子

我有兩個字段,USER_ID和CLIENT_ID表。對於每個USER_ID,都有1到n個CLIENT_ID。

讓我們說,用戶A鏈接到客戶端1,2和3.我想構建一個查詢,返回也鏈接到所有這些客戶端的其他用戶。他們可能會鏈接到更多的客戶端,但他們必須鏈接到用戶A的所有客戶端。

示例:用戶B與客戶端1,2,3,4有鏈接。用戶C具有到客戶端1,2的鏈接。該查詢應該返回用戶B,因爲用戶B有鏈接到所有用戶A的客戶端。用戶C不應該被退回,因爲他只有一些用戶A的客戶端的鏈接,但不是全部。

這似乎是一個看似簡單的問題,但我不能爲我的生活拿出一個滿足我的約束條件的查詢。任何有經驗的SQL大師能幫助我嗎?

回答

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 

我沒有表測試這個反對,但應該很少調試工作。

+0

完美!謝謝你們,這個救了我的培根。 – helgeg 2010-03-12 10:22:57

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的具體,但這樣的事情應該工作。