【问题标题】:How do I get the latest message from my MySQL Schema?如何从我的 MySQL Schema 中获取最新消息?
【发布时间】:2014-07-02 17:51:28
【问题描述】:

我假设这很容易,但我在弄清楚它时遇到了问题。我想以最有效的方式通过我的查询为每个用户获取每个对话的最新消息。我的 2 个表的架构如下所示。

CONVERSATIONS --
id
fromUserId
toUserId
timestamp

MESSAGES --
id
conversationId
userId
message
timestamp

这是我到目前为止想出的,但这只是给了我第一条信息——这是不对的。我需要最新消息(最高 UNIX 时间戳)

SELECT c.fromUserId, c.toUserId, c.productId, m.userId, m.message, m.timestamp
FROM conversations c, messages m
WHERE (c.fromUserId = '9' OR c.toUserId = '9')
AND m.conversationId = c.id
GROUP BY c.id

任何帮助将不胜感激。我尝试了其他一些方法,比如子查询等等,但这对我来说似乎不是一个好的解决方案。

还要注意,conversationId 在消息表中是唯一的。

【问题讨论】:

  • SELECT TOP 1 <.....> GROUP BY c.id ORDER BY m.timestamp DESC
  • 糟糕,在 MySQL 中,您只需将 LIMIT 1 添加到末尾,忽略我之前评论中的 TOP 1
  • 由于您使用GROUP BY c.id,我假设您想要每个对话的最新消息,而不仅仅是所有对话中的一条最新消息。如果你想要前者,这是一个greatest-n-per-group 问题。关注该标签并查看该类型查询的许多其他答案。

标签: mysql sql database performance join


【解决方案1】:

基本上,您可以将查询限制为 1 个结果,如下所示:

SELECT c.fromUserId, c.toUserId, c.productId, m.userId, m.message, m.timestamp
FROM conversations c, messages m
WHERE (c.fromUserId = '9' OR c.toUserId = '9')
AND m.conversationId = c.id
GROUP BY c.id
ORDER BY m.timestamp DESC
LIMIT 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-14
    • 2020-12-03
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    • 2022-12-22
    相关资源
    最近更新 更多