2016-02-28 70 views
0

我有以下表格。复杂的MySQL对话组查询?

conversations 
| id | 
------ 
    1 

conversationMembers 
| id | conversationId | userId | email 
--------------------------------------- 
    1   1   2  null 
    2   1   null [email protected] 
    3   1   7  null 

基本上,我试图构建一个MySQL查询,通过conversationMembers的精确匹配返回从对话表中的一行。

因此,这里有一些预期回报的例子。

假设我们想要一个会话id用于以下确切成员之间的会话:userId 2,userId 7,email [email protected] - 这会在conversationMembers表中看到具有相同对话ID的行以及完全匹配我们正在搜索的那个对话ID的所有成员。它将返回ID为1的对话行。

这是另一个示例。我们希望在用户标识2和用户标识7之间进行对话的对话标识。这将看到用户标识2和用户标识7之间没有对话,所以它不会返回任何内容。

最后一个例子。假设我们想要userId 7和userId 9,这也会看到这两个用户标识之间没有独占对话,并且不会返回任何内容。

要做到这一点,最好的方法是什么?我玩过子查询,但是我所提出的一切似乎都无法处理完全匹配的情况 - 例如,我在选择对话时遇到了问题 - 仅在userId 2和7上(它不会返回任何内容)并且正在接受对话1,尽管我没有指定我想与[email protected]电子邮件进行对话。如果我搜索了所有会员的完全匹配的conversationId,我应该只会收到对话1返回。

回答

0

一种方法是使用group byhaving。这很好,因为它可以表达什么是灵活的。因此,您的第一个示例是:

select conversionid 
from conversationMembers 
group by conversionid 
having sum(userId = 2) > 0 and 
     sum(userId = 7) > 0 and 
     sum(email = '[email protected]') > 0; 

总计的条件计算匹配的成员数。 > 0表示至少有一个。对于第二种情况,该条款是:

having sum(userId = 2) > 0 and 
     sum(userId = 7) > 0 and 
     sum(userId not in (2, 7)) = 0; 

或者:

select conversionid 
from conversationMembers 
group by conversionid 
having sum(userId = 2) > 0 and 
     sum(userId = 7) > 0 and 
     count(distinct userId) = 2; 
+0

似乎完美地工作!谢谢! –