我设计了一个数据库架构,允许使用Facebook风格的消息系统(没有能够编辑消息的功能)。这是:
我的想法是用户向对话发送消息,而不是向其他用户发送消息。这样,用户就可以订阅会话,从而实现多种用户风格的聊天。
conversation
就像一个房间。如果用户 bob 和用户 joe 开始交谈,则会创建一个会话,如果不存在的话。每当“bob'和'乔#39;说他们的消息将始终具有相同的conversation_id
。这将允许我通过使用conversation_id
获取所有消息来返回所有通信。
多个用户可以是conversation
的一部分。 conversation_users
表存储了conversation_id
和user_id
,这使我可以查询表格以获取All users who have the conversation_id X
。
我遇到的问题是我想查询:Give me the conversation_id used by Joe and Bob
,因此我可以使用此conversation_id
返回“Joe'之间的所有消息”。和鲍勃'
我怎么能实现这个目标?我想我已经错过了我的模型中的重要内容,这使得它看起来比它需要的更复杂。但我无法看清楚。
答案 0 :(得分:1)
您需要Joe和Bob使用的conversation_id值的交集。
如何获得Joe使用的conversation_id值?
SELECT cu.conversation_id
FROM Users u
JOIN Conversation_Users cu ON u.id = c.user_id
WHERE username = 'Joe'
你为Bob做同样的事,给你两个子查询。验证这些;确保它们正常工作。
然后你这样做:
SELECT cu.conversation_id
FROM Users u
JOIN Conversation_Users cu ON u.id = c.user_id
WHERE username = 'Joe'
AND cu.conversation_id IN
(
SELECT cu.conversation_id
FROM Users u
JOIN Conversation_Users cu ON u.id = c.user_id
WHERE username = 'Bob'
)
它会为您提供涉及两个用户的会话ID列表。 修改 JOIN
也可以处理此逻辑。
SELECT a.conversation_id
FROM (SELECT cu.conversation_id
FROM Users u
JOIN Conversation_Users cu ON u.id = c.user_id
WHERE username = 'Joe'
AND cu.conversation_id
) a
JOIN ( SELECT cu.conversation_id
FROM Users u
JOIN Conversation_Users cu ON u.id = c.user_id
WHERE username = 'Bob'
) b ON a.conversation_id = b.conversation_id
第一个查询可以放在MySQL视图中,而第二个查询则不能。哪一个更快?很难知道他们两个都没试过。
可能会有多个此类对话。如果你只想要一个,你将不得不弄清楚如何选择它。
您没有遗漏任何模型。只是因为MySQL没有INTERSECTION
运算符,所以这种交集操作的逻辑变得微妙。