复杂的MySQL会话组查询?

时间:2016-02-28 00:20:32

标签: php mysql sql performance

我有以下表格。

conversations
| id |
------
  1

conversationMembers
| id | conversationId | userId | email
---------------------------------------
   1         1            2      null  
   2         1           null    test@test.com
   3         1            7      null

基本上,我正在尝试构建一个MySQL查询,它通过conversationMembers的完全匹配从会话表中返回一行。

所以,这里有一些预期回报的例子。

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

这是另一个例子。我们想要userId 2和userId 7之间的对话的对话ID。这将看到userId 2和userId 7之间不存在对话,因此它不会返回任何内容。

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

最好的方法是什么?我玩过子查询,但我提出的所有内容似乎都无法处理完全匹配的情况 - 我在选择对话时遇到问题 - 仅在userId 2和7上(应该什么也不返回)虽然我没有说明我希望与test@test.com电子邮件作为其中一部分进行对话。如果我搜索了对话中所有成员的完全匹配,我应该只得到对话1。

1 个答案:

答案 0 :(得分:0)

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