2017-04-20 104 views
0

我聊天参与者的表看起来像这样:GROUP BY chat_id - 返回只有当所有条件的行匹配

id   chat_id   participant_id 
1   1    5 
2   1    7 
3   1    9 

如果用户创建一个新的聊天,我们首先要确保一与所请求的参与者聊天并不存在,如果有,我们只会使用该聊天。

因此,我们假设我想与参与者5,7,911创建聊天。

在这种情况下,将不会返回任何内容,因为不存在包含所有这些成员的聊天,所以必须创建与新的chat_id的新聊天。

然而,如果我们要创建只有参与者57,并91chat_id应返回聊天。

有没有一种有效的方式来构建一个查询来实现这一点,而不使用循环?

我想是这样的,但从来没有得到想要的结果:

SELECT chat_id FROM chat_participants WHERE participant IN(5,7,9) GROUP BY chat_id 

有什么建议?

回答

2

你只需要与你的要求参与者的数量加总条件这样

SELECT chat_id FROM chat_participants WHERE participant IN(5,7,9) GROUP 
BY chat_id having count(chat_id) = 3 

如果你传似IN(5,7,9,11)比你的条件将是having count(chat_id) = 4

+0

假设参与者不能上市在聊天中多次,但公平的假设。 (如果我们有5,7,7),当它不可能时,你会把它当作比赛来对待。但如果这种情况不能存在,那么增加不同的数量就是开销。 – xQbert

+0

@xQbert是的,如果他/她添加重复的参与者的身份证明他/她必须管理数量和什么是我正在更新丢失 –

+0

我不会更新。假设是公平的,假设是明显的,会降低绩效。只希望DanL知道这个假设;如果假设不好,该如何解决。 – xQbert

2
select chat_id 
from 
(
select chat_id, group_concat(participant order by participant, ',') as gc 
from chat_participants 
where chat id in (select chat_id from chat_participants where participant IN(5,7,9)) 
group by chat_id 
) x1 
where x1.gc = '5,7,9' 
+0

也许您还需要按参加者添加订单 –

+0

@knowledge .... good shout – JohnHC