SQL,在两个人之间的对话中查找最近的条目

时间:2012-05-27 19:57:30

标签: mysql sql

我有一个表,消息,其内容如下:

enter image description here

此表存储人与人之间发送的所有消息,但它需要像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,但我无法理解它需要找到一个对我来说是FROM或TO而不仅仅是或仅来自。

如果问题没有详细描述,请在投票前告诉我,我会尽力使其更加详细,但我想不出用什么词来形容需要做什么显示得足够清楚。

编辑:

以下是所需功能的一个很好的例子:

说我给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和two)来指示我和John Doe是否相关,我不认为常规的GROUP BY语句会起作用。

现在,如果另外,Bob Joe给我发了一条消息,它可能看起来像:

“来自Bob Joe” “你好”

“致Jane Doe” “你好,”

“来自John Doe” “你的信息很有趣”

2 个答案:

答案 0 :(得分:1)

您可以自行加入表格并使用外部联接,这样任何“早期”消息都会“过滤掉”任何“非早期”消息。

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

答案 1 :(得分:1)

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

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

然后使用该查询的结果作为任何标准minimum row techniques的输入。