我有下表。
conversations
| id |
------
1
和
conversationMembers
| id | conversationId | userId | email
---------------------------------------
1 1 2 null
2 1 null [email protected]
3 1 7 null
基本上,我正在尝试构造一个MySQL查询,该查询通过对sessionMembers的完全匹配从对话表返回一行。
因此,这里有一些预期收益的例子。
假设我们想要以下确切成员之间的对话的对话ID:userId 2,userId 7,电子邮件[email protected]这将看到,在sessionMembers表中,行具有相同的对话ID,并且所有行之间都完全匹配我们正在搜索的对话ID的成员。它将返回ID为1的对话行。
这是另一个例子。我们需要一个userid 2和userId 7之间对话的对话id。这将看到userId 2和userId 7之间没有对话,因此它不会返回任何内容。
还有最后一个例子。假设我们想要userId 7和userId 9,这还将看到这两个用户ID之间没有互斥的对话,并且不会返回任何内容。
最好的方法是什么?我玩过子查询,但是我想出的所有内容似乎都无法处理确切的匹配情况-例如,在选择对话时遇到了问题-仅在userId 2和7上(应该不返回任何内容)即使我没有指定我希望通过[email protected]电子邮件进行对话,也可以重新获得对话ID 1。如果我在对话中搜索所有成员的完全匹配项,则应该只返回了sessionId 1。
一种方法是使用group by
和having
。很好,因为它在表达内容方面很灵活。因此,您的第一个示例是:
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;
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句