我有一个表,消息,其内容如下:
此表存储人与人之间发送的所有消息,但它需要像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” “你的信息很有趣”
答案 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的输入。