繁体   English   中英

复杂的MySQL会话组查询?

[英]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 byhaving 这很好,因为它可以灵活表达。 因此,您的第一个示例是:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM