3

我有一个表 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” “你的信息很有趣”

4

2 回答 2

2

您可以自联接表并使用外部联接,以便任何“早期”消息将“过滤掉”任何“非早期”消息。

SELECT * FROM Messages main LEFT JOIN Messages earlier
    ON earlier.time < main.time AND 
        (
            earlier.To_User = main.To_User AND earlier.From_User = main.From_User OR  
            earlier.To_User = main.From_User AND earlier.From_User = main.To_User
        )
WHERE (main.To_User = x OR main.From_User = x) AND earlier.id IS NULL
ORDER BY main.Time DESC
于 2012-05-27T20:07:56.533 回答
1

如果您可以消除出现在“from”或“to”列中的人的复杂性,那么这将是在组中查找最小行的常见问题的一个实例。所以你可以从这个开始:

SELECT id, time, to_user as user
UNION ALL SELECT id, time, from_user as user

然后将该查询的结果用作任何标准最小行技术的输入。

于 2012-05-27T20:13:41.140 回答