Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql连接还是多重选择?_Sql_Join - Fatal编程技术网

sql连接还是多重选择?

sql连接还是多重选择?,sql,join,Sql,Join,我有两个表格-对话和参与者 参与者有两列-user\u id和conversation\u id 现在我想查找两个(或更多)特定用户参与的所有对话 我试过这样的方法: select conversation_id from participants where id = 123 and id = 456 select distinct c.* from conversations as c inner join participants as p1 on p1.conversation_id

我有两个表格-
对话
参与者

参与者有两列-
user\u id
conversation\u id

现在我想查找两个(或更多)特定用户参与的所有对话

我试过这样的方法:

select conversation_id from participants where id = 123 and id = 456
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);
但这显然不是很好,因为一行不能同时有两个用户ID

有人有什么建议吗?多个选择查询?

尝试:

SELECT conversation_id FROM participants WHERE user_id = 123
INTERSECT
SELECT conversation_id FROM participants WHERE user_id = 456

像这样的怎么样:

select conversation_id from participants where id = 123 and id = 456
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);
更新:如果您的dbms不支持count(distinct…),并且您确定每个对话都具有非重复的每个用户,则可以编写查询

select conversation_id, count(*) 
from participants
where user_id in (u1, u2, u3...)
group by conversation_id
having count(*) > 1
尝试:


编辑后我就放弃了我的第一次尝试。这是错误的答案。我的新答案是:

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)

(进一步编辑以从选择列表中删除不在group by中的列。

-1这不会检查OP要求的特定用户id。+1如果将它们替换为u1、u2,则会检查。但是,它确实需要一个
group by
子句。@JeremyHolovas
中的
不是什么大问题,您错过了
组现在,它将删除我的否决票。(奇怪的是,我否决的内容与你最初的答案大不相同。)问题是针对对话,而不仅仅是对话id,尽管sql建议只查找对话id。但这是一个可行的解决方案。是的,效果很好!非常感谢;稍后当我再次回家时,将进一步剖析此问题。这是正确的方法,但它失败了“两个(或更多)“特定用户”标准。它适用于两个用户,但不适用于三个用户。@CDJorgenson:示例中只提供了两个特定用户。正如您所说,如果在
in
子句中指定了更多用户,并且
计数(不同的用户id)也可以使用相同的方法>
条件相应更新。这看起来也与我的否决票不同。多么奇怪。你能编辑你的帖子,我将删除我的否决票吗;虽然这可能不是很有效。(或者可能是,我不知道)@杰里米·霍洛瓦茨:这是一篇编辑稿——当时可能应该把这一点说得更清楚!在发布了我的原始答案后不久,我就开始问“你到底在想什么?”然后又回头看了一遍。这对2名参与者来说效果很好,也很简单,但你需要在第3次中重复“相交/选择”participant@AnthonyGrist好的,我没有看到编辑历史记录,所以我假设我正在失去理智(安全假设).我必须在你的新帖子之后进行否决,但在刷新之前…事实上,我无法删除否决,除非你再次编辑你的帖子。