Group By MySQL Query返回带参数的特定结果

时间:2016-01-21 20:24:51

标签: mysql mysqli

在用户开始私聊之前(2个成员之间,而不是群聊)我想查看是否已经存在仅包含这两个成员的聊天。如果他们在结束时删除了聊天,当他们再次向同一用户发送消息时,我希望它与旧聊天合并,而不是为同一个两个成员开始重复聊天。

这是我的结构

`chats` table
id     created_time 
 1     [TIMESTAMP]
 2     [TIMESTAMP]

`chats.parties` table   
id     chat_id     member_id     invited_by
 1     1           1             0 // creator of chat
 2     1           2             1
 3     1           3             1
 4     2           1             0
 5     2           2             1

chat_id分组,但仅返回包含member_id=1member_id=2行的结果;不多也不少。

对于上表,仅返回chat_id=2行,因为chat_id=1包含第3个成员。

原始SQL是否可以实现?我宁愿不在PHP中循环,因为它需要一段时间与很多聊天。

2 个答案:

答案 0 :(得分:1)

使用条件COUNT

<强> SQL Fiddle Demo

SELECT c.`id`
FROM chats c
LEFT JOIN chats_parties cp
       ON c.`id`= cp.`chat_id`
GROUP BY c.`id`
HAVING COUNT(case when `member_id` = 1 then 1 END) >= 1 
   AND COUNT(case when `member_id` = 2 then 1 END) >= 1 
   AND COUNT(DISTINCT `member_id` ) = 2

答案 1 :(得分:1)

以下是获得所需结果的两种不同方法:

-- using conditional aggregation
select chat_id from chat_parties
group by chat_id
having sum(case when member_id = 1 then 1 else 0 end) > 0
   and sum(case when member_id = 2 then 1 else 0 end) > 0
   and sum(case when member_id not in (1, 2) then 1 else 0 end) = 0

-- using a correlated subquery
select chat_id from chat_parties c1
where member_id in (1,2)
and not exists (
  select 1 from chat_parties where chat_id = c1.chat_id and member_id not in (1,2)
)
group by chat_id having count(distinct member_id) = 2

更改表格名称以适合您的实际设置。