2010-03-11 2 views
4

Я почесал голову, чтобы выяснить, решение на следующий вопрос:SQL запрос для определения полностью содержится подмножество

У меня есть таблица с двумя полями, USER_ID и CLIENT_ID. Для каждого USER_ID есть от 1 до n CLIENT_ID.

Скажем, пользователь A связан с клиентами 1,2 и 3. Я хочу построить запрос, который возвращает других пользователей, которые также связаны со всеми этими клиентами. Они могут быть связаны с большим количеством клиентов, но они должны иметь ссылки на всех клиентов пользователя.

Пример: Пользователь B имеет ссылки на клиентов 1,2,3,4. Пользователь C имеет ссылки на клиентов 1,2. Затем запрос должен вернуть User B, так как пользователь B имеет ссылки на все клиенты User 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

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 специфический, но что-то подобное должно работать.

Смежные вопросы