我有以下表格。
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。
答案 0 :(得分:0)
一种方法是使用cell.someLabel
和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;