复杂的MySQL会话组查询?

布雷登·巴通巴卡尔

我有下表。

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。

戈登·利诺夫(Gordon Linoff)

一种方法是使用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;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章