我有一个表 Messages,其设置如下:
该表存储人与人之间发送的所有消息,但是它需要像 FaceBook 的消息系统一样。
为此,我的查询需要类似于:
SELECT * FROM Messages WHERE To_User = x OR From_User = x ORDER BY Time DESC
这将按时间顺序获取发送或接收的每条消息“x”,最新消息首先出现。
然而,Facebook 的系统让它有点像一个论坛,所以我只想要一条消息,其中人 y 参与任何给定的查询结果。所以我不希望这种情况发生:
To_User:6 From_User:7 状态:我同意你的消息时间:12345
To_User:7 To_User:6 状态:你同意我的信息吗?时间:12344
假设我正在为用户 6 显示消息页面,两条消息都会显示在我当前的系统中。相反,应该只选择最上面的一条,因为我只想显示用户 6 和 7 之间的最新消息,而不是每条消息。
自然,这通常只要求一个 LIMIT 语句,但我需要能够收到很多消息,但唯一的规则是:
1- 必须是 FROM 或 TO 用户 X 2- 不能选择两条消息是 FROM 或 TO 用户 Y 3- 选择的消息必须是用户 X 和 Y 之间对话中的最新消息
这真的很难描述,但我希望我已经对它进行了足够详细的描述以提供解决方案。
我曾考虑过 GROUP BY,但我无法考虑到它需要找到一个来自或来自我的人,而不仅仅是来自或来自。
如果问题描述得不够详细,请在否决之前告诉我,我会尽力让它更详细一点,但我想不出用什么词来描述需要足够清楚地显示的内容.
编辑:
这是所需功能的一个重要示例:
假设我向 John Doe 发送了一条消息,然后立即进入我的消息页面,在最顶部会显示
“致 John Doe”“我发送的信息”
但是,如果 John Doe 回复,该条目将不再显示在页面上,它将被我和 John Doe 之间对话中的最新条目替换,因此虽然实际条目仍在数据库中,但不会显示不再:
“来自 John Doe” “你的信息很有趣”
但如果我之后给 Jane Doe 发了一封邮件,它会推动我和 John Doe 的对话,所以看起来像这样:
“致 Jane Doe” “你好”
“来自 John Doe” “你的信息很有趣”
现在有了我在这篇文章中陈述的第一个查询,结果将是:
“致 Jane Doe” “你好”
“来自 John Doe” “你的信息很有趣”
“致 John Doe”“我发送的信息”
但是,我不想显示我和 John Doe 之间的多个列,但是由于我正在查看表中的两个不同列(From 和两个)来指示我和 John Doe 是否相关,所以我不'认为常规的 GROUP BY 语句不会起作用。
现在,如果另外,Bob Joe 给我发了一条消息,它可能看起来像:
“来自鲍勃·乔”“你好”
“致 Jane Doe” “你好”
“来自 John Doe” “你的信息很有趣”