sql join или множественный выбор? - PullRequest
2 голосов
/ 18 января 2012

У меня есть две таблицы - Conversations и Participants.

Участники имеют две колонки - user_id и conversation_id

Теперь я хочу найти все разговоры, в которых две(или более) участвуют конкретные пользователи.

Я пробовал что-то вроде этого:

select conversation_id from participants where id = 123 and id = 456

, но это, очевидно, не получилось очень хорошо, так как в строке не может быть двух user_ids нав то же время ...

Кто-нибудь получил какие-либо предложения, куда идти дальше?Несколько запросов выбора?

Ответы [ 5 ]

3 голосов
/ 18 января 2012

Попробуйте:

select conversation_id 
from participants 
where user_id in (123, 456)
group by conversation_id 
having count(distinct user_id) > 1
3 голосов
/ 18 января 2012
select conversation_id, count(distinct user_id) 
from participants
where user_id in (u1, u2, u3...)
group by conversation_id
having count(distinct user_id) > 1

Обновление: Если ваша база данных не поддерживает подсчет (отличный ...) и вы уверены, что в каждом диалоге каждый пользователь не дублирован, вы можете написать запрос

select conversation_id, count(*) 
from participants
where user_id in (u1, u2, u3...)
group by conversation_id
having count(*) > 1
0 голосов
/ 18 января 2012

Отредактировано, чтобы отказаться от всей моей первой попытки.Это был неправильный ответ.Мой новый ответ:

declare @usersToFind table (userid int)
insert into @usersToFind
                select 11
    union all   select 12
    union all   select 13

select p.convid, count(*) [participantCount]
from
    @participants p
    left join @conversations c
        on p.convid = c.id
where
    p.userid in (select userid from @usersToFind)
group by
    p.convid
    -- identify all conversation columns you care about here, and repeat them in select clause
having
    count(distinct p.userid) >= (select count(*) from @usersToFind)

Проблема заключалась в том, что он не будет принимать список конкретных пользователей для поиска.В этом диалоге можно найти любой разговор, в котором все пользователи (независимо от того, сколько вы указали) являются участниками этого разговора.

Если интересно, вот SQL, который я использовал для настройки моего теста:

declare @conversations table (id int)
declare @participants table (userid int, convid int)

insert into @conversations values (100)
insert into @conversations values (200)
insert into @conversations values (300)
insert into @conversations values (400)

insert into @participants values (11, 100)
insert into @participants values (12, 100)
insert into @participants values (13, 100)

insert into @participants values (11, 200)
insert into @participants values (12, 200)

insert into @participants values (11, 300)
insert into @participants values (13, 300)

insert into @participants values (12, 400)
insert into @participants values (13, 400)

(дополнительно отредактировано для удаления столбца из списка выбора, которого не было в группе, по

0 голосов
/ 18 января 2012

как насчет этого:

select distinct c.*
from conversations as c
inner join participants as p1
on p1.conversation_id = c.conversation_id
where
p1.user_id = 123
and exists (select null from participants as p2 where p2.conversation_id = c.conversation_id 
  and p2.user_id = 456);
0 голосов
/ 18 января 2012

Попробуйте:

SELECT conversation_id FROM participants WHERE user_id = 123
INTERSECT
SELECT conversation_id FROM participants WHERE user_id = 456
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...