2017-04-15 35 views
0

我需要的东西似乎有点复杂,但后来我又不擅长SQL。基本上我有一张存储对话参与者的表格。我需要一个查询,它将使用两个提供的用户ID来确定是否存在仅包含两个给定用户的对话。包含超出这两个用户的其他用户的对话不应被计入 - 两个给定用户之间只进行一对一的对话。SQL:根据两个给定值精确选择具有匹配ID的两行

这里是我的SQLfiddle:http://sqlfiddle.com/#!9/284e1/33/0

而我正在进行的查询这是不是做的伎俩:

SELECT * FROM mybb_conversation_participants WHERE conversation_id IN ( SELECT conversation_id FROM mybb_conversation_participants WHERE (user_id = 6 OR user_id = 11) GROUP BY conversation_id HAVING COUNT(*) = 2 );

我不认为我了解HAVING COUNT(*) = 2部分,因为此查询将返回包含这两个用户的所有对话,即使该对话中也存在其他用户。同样,应该只选择两个提供的用户之间的1对1对话,否则查询应该不选择任何内容。例如,在上面的SQLfiddle中,只有conversation_id1219的行应该返回,因为所有其他匹配都包含两行以上的行。

这就是我希望HAVING声明会做,但显然不是。

任何想法?

回答

1

您可以group byhaving做到这一点:

SELECT conversation_id 
FROM mybb_conversation_participants 
GROUP BY conversation_id 
HAVING SUM((user_id NOT IN (6, 11)) = 0; 

这是什么做的?它正在通过对话ID进行汇总。然后,对于每次对话,它计数的用户是而不是其中之一。它接受对话这是真实的。

如果你喜欢积极,这可能是更容易跟踪:

HAVING SUM((user_id IN (6, 11)) = COUNT(*) 

这是说,所有的谈话的用户占与您所选择的人。

最后,如果你想,以确保这两个(全部)都参与:

HAVING SUM((user_id IN (6, 11)) = COUNT(*) AND 
     COUNT(DISTINCT user_id) = 2 
+0

对不起,我之前我看到您的编辑评论。这非常完美,非常感谢您的快速响应! –

相关问题