我一直在研究PHP消息系统,我想实现两种访问特定会话/线程的方法。
第一个是查询会话的ID(<!DOCTYPE html><!-- A comment --><html><head><title>A title</title></head><body></body></html>
),这非常简单明了。它也是查询组消息的唯一方法。
section方法是查询个人“1对1”消息线程(message/{numeric ID}
)。我将列出下面使用的三个表格。
表message/{alphanumeric user ID}
:
conversations
id | locked | timestamp
表示对话中最后一条消息的时间,以便在排序时减少查询次数。
表timestamp
:
participants
id | conversation | member | timestamp
是来自conversation
的外国ID密钥,conversations
是表member
的外键,而members
是该用户的最后一项活动。 “看到”功能目的的对话。
表timestamp
:
messages
这里的列非常明显。
现在,我想根据会员ID获取会话ID,其中我只有A人和B人作为参与者。
我已经考虑了好几个小时了,没有想到优雅的解决方案。
答案 0 :(得分: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.id
是 PK ,participants.conversation
是 FK 与conversations.id
相关联,participants.member
是< strong> KEY ,conversations.timestamp
是 KEY 。