从基于收件人的数据库中选择对话

时间:2017-08-01 21:21:13

标签: php sql

我一直在研究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人作为参与者。

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

1 个答案:

答案 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