2017-08-01 10 views
1

私はPHPメッセージングシステムに取り組んでおり、特定の会話/スレッドにアクセスする2つの方法を実装したいと考えています。データベースからの会話を受信者に基づいて選択する

最初のものは会話のID(message/{numeric ID})を照会していますが、これはかなりシンプルで簡単です。また、グループメッセージを照会する唯一の方法です。

セクションメソッドは、個人的な「1対1」メッセージスレッド(message/{alphanumeric user ID})を照会しています。私は以下の3つのテーブルをレイアウトします。

conversations

id | locked | timestamp 

timestampソートときより少ないクエリを有するために、会話における最後のメッセージの時間を示します。

participants

id | conversation | member | timestamp 

conversation外国IDキーではconversationsから、memberはテーブルmembersの外部キーであるとtimestampは「見」機能の目的で、会話の中で、ユーザの最後のアクティビティです。

messages

id | member | conversation | message | timestamp 

列は、ここではかなり自明です。

ここでは、メンバーIDに基づいて、参加者としての人物Aと人物Bのみを持っている会話のIDを取得したいと思います。

私はこれについて何時間も考えていましたが、洗練されたソリューションが心に浮かびません。

+0

AとBだけですので、他の人はいないはずです、正しいですか? – iXCray

+0

確かに、それは正しい - AとBのみ、他は誰もいない。 –

+0

しかし、結果はこれらの基準で複数の会話になる可能性があります。あなたはすべての、または最新のものだけを望みますか? – steven

答えて

1
SELECT c.id, c.timestamp 
FROM conversations c 
RIGHT JOIN participants p_a ON (p_a.conversation=c.id) 
RIGHT JOIN participants p_b ON (p_b.conversation=c.id) 
WHERE 
    p_a.member='A-ID' AND 
    p_b.member='B-ID' 
GROUP BY c.id 
HAVING count(*)=1 
ORDER BY c.timestamp DESC 

参加者の1Mレコードと会話の400Kレコードで0,012秒+ネットワークを使用しました。

conversations.idPKparticipants.conversationconversations.idにリンクFKであり、participants.memberKEYconversations.timestampKEYです。

+1

なぜc.idでグループ化すると最大c.timestampですか?このグループのタイムスタンプは1つだけです。 – steven

+0

あなたはそうです。修正された – iXCray

+0

優秀かつ優雅。非常に高く評価。 –

関連する問題