2017-08-01 57 views
1

我一直在研究PHP消息传递系统,并且我想实现访问特定对话/线程的两种方法。根据收件人从数据库中选择对话

第一个问题是查询会话的ID(message/{numeric ID}),这非常简单直接。它也是查询群组消息的唯一方法。

该部分的方法是查询个人“1对1”消息线程(message/{alphanumeric user ID})。我将列出下面使用的三张表。

conversations

id | locked | timestamp 

timestamp表示在会话进行排序时具有较少的查询起见最后一个消息的时间。

participants

id | conversation | member | timestamp 

conversation是国外ID键从conversationsmember是表members外键和timestamp在谈话的“看到”的功能目的用户的最后一项活动。

messages

id | member | conversation | message | timestamp 

列是不言自明这里。

现在,我想取得对话的ID,我只根据成员ID将人员A和人员B作为参与者。

我已经考虑了几个小时,没有想到优雅的解决方案。

+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.conversationFKconversations.id相连,participants.memberKEYconversations.timestampKEY

+1

为什么最大c.timestamp如果你通过c.id分组?这个组只能有一个时间戳。 – steven

+0

你说得对。更正 – iXCray

+0

优秀和优雅。非常感谢。 –

相关问题