[英]Complex MySQL Conversation Group Query?
我有下表。
conversations
| id |
------
1
和
conversationMembers
| id | conversationId | userId | email
---------------------------------------
1 1 2 null
2 1 null test@test.com
3 1 7 null
基本上,我正在尝试构造一个MySQL查询,该查询通过对sessionMembers的完全匹配从对话表返回一行。
因此,这里有一些预期收益的例子。
假设我们想要以下确切成员之间的对话的对话ID:userId 2,userId 7,电子邮件test@test.com-这将看到,在sessionMembers表中,行具有相同的对话ID,并且所有行之间都完全匹配我们正在搜索的对话ID的成员。 它将返回ID为1的对话行。
这是另一个例子。 我们需要一个userid 2和userId 7之间的对话的对话ID。这将看到在userId 2和userId 7之间没有专门的对话,因此它不会返回任何内容。
最后一个例子。 假设我们想要userId 7和userId 9,这还将看到这两个用户ID之间没有互斥的对话,并且不会返回任何内容。
最好的方法是什么? 我玩过子查询,但是我提出的所有内容似乎都无法处理确切的匹配情况-例如,在选择对话时遇到了问题-仅针对userId 2和7(应该不返回任何内容)即使没有指定我希望通过test@test.com电子邮件进行对话,也可以重新获得对话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 = 'test@test.com') > 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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.