我有以下两个表:
CREATE TABLE messages (
messageId INT,
threadId INT,
recipientUserId INT,
message TEXT
);
CREATE TABLE thread_recipients (
recipientUserId INT,
threadId INT
);
我希望SELECT
来自消息表的每个线程的特定用户的最新消息。我还希望从threads_recipients表中获取属于所选线程的所有其他用户。
我认为以下内容可行:
SELECT MAX(m.messageId) AS maxMessageId, m.threadId, m.message
FROM messages AS m
RIGHT JOIN thread_recipients AS tr ON tr.threadId=m.threadId
WHERE m.recipientUserId='2'
GROUP BY m.threadId
但是,由于GROUP BY
,它只为每个threadId选择一行,而不管该线程的一部分用户数。甚至可以在一个查询中完成吗?
对任何响应者表示亲切的问候。
答案 0 :(得分:0)
Oracle通过使用分析函数解决了这个问题:
select max(messageId) over (partition by threadId) ...
在没有group by子句的情况下调用聚合函数非常方便,非常适合您的情况。
然而,在MYSQL中,使用内部选择来模仿它,但请记住,对于非常大的表,它们可能会占用大量内存。
SELECT mm.maxMessageId, m.threadId, m.message
FROM messages AS m RIGHT JOIN thread_recipients AS tr ON tr.threadId=m.threadId,
(
select threadId, max(messageId) as maxMessageId
from messages group by threadId
) AS mm
WHERE m.recipientUserId=2
AND m.threadId = mm.threadId