使用和不使用GROUP BY的mysql连接表选择

时间:2011-09-10 11:26:44

标签: mysql

我有以下两个表:

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选择一行,而不管该线程的一部分用户数。甚至可以在一个查询中完成吗?

对任何响应者表示亲切的问候。

1 个答案:

答案 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