2016-01-21 77 views
0

在用戶開始私人聊天之前(在兩個成員之間,而不是羣聊)之前,我想檢查是否已經有一個只包含這兩個成員的聊天。如果他們已經在他們的最後刪除了聊天,當他們再次向同一用戶發送消息時,我希望它與舊聊天合併,而不是爲相同的兩個成員啓動重複聊天。按MySQL查詢返回特定結果的參數

這是我的結構

`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中循環,因爲它需要很長時間的聊天。

回答

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 

更改表名,以適應您的實際建立。

+0

不知道爲什麼我需要爲新創建的聊天添加左連接。但可能可以刪除。 –

+0

@JuanCarlosOropeza事實上,所要求的所有信息都只出現在一張表中,但情況並非總是如此,因此常常需要左連接:) – jpw

1

使用條件COUNT

​​3210

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 
+0

哎呀!它按原樣工作! – Dave

+0

@Dave告訴你:) –