在用户开始私聊之前(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=1
和member_id=2
行的结果;不多也不少。
对于上表,仅返回chat_id=2
行,因为chat_id=1
包含第3个成员。
原始SQL是否可以实现?我宁愿不在PHP中循环,因为它需要一段时间与很多聊天。
答案 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
更改表格名称以适合您的实际设置。