【发布时间】: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