14

我有两个表,对话和消息,我想做的是从对话到消息进行内部连接。

这是我的查询:

    SELECT 
    messages.msg,
    messages.`read`,
    conversations.userid,
    conversations.contactid

    FROM conversations 
        INNER JOIN messages ON 
        conversations.id = messages.convId
    WHERE conversations.id IN(443,444)

现在一切正常,但最后一件事是在我使用的内部连接中

conversations.id = messages.convId

我只想获得最高的 id,例如:

 AND MAX(messages.id)

但这不起作用

编辑: 我试过一次使用:

LEFT JOIN messages 
    ON conversations.id = messages.convId 
        AND messages.id = MAX(messages.id) 

但我收到一条错误消息:无效使用组功能。

4

3 回答 3

23

编辑

这会奏效!

SELECT conversations.*, m1.* 
FROM conversations 
LEFT JOIN messages m1
    ON conversations.id = m1.cid 
    AND m1.id = (
            SELECT MAX(m2.id) 
            FROM messages m2 
            WHERE m2.cid = conversations.id
        )
于 2013-05-26T15:46:37.490 回答
2

您正在寻找组中的最大值。MySQL 没有任何非常明显的方法来做到这一点(很多方法都有点诡计)。

但是,您只是在寻找两组。因此,您可以只查找每个组中的限制并将它们组合使用union all

SELECT m.msg, m.`read`, c.userid,
       c.contactid
FROM conversations c inner join
     ((select m.*
       from messages m
       where m.convid = 443
       order by m.id desc
       limit 1
      ) union all
      (select m.*
       from messages m
       where m.convid = 444
       order by m.id desc
       limit 1
      )
     ) m
     ON c.id = m.convId;

如果您在messages(convid, id)and上有索引conversations(id),那么这应该很快。

您也可以使用更标准的方法来执行此操作:

SELECT m.msg, m.`read`, c.userid,
       c.contactid
FROM conversations c inner join
     messages m
     ON c.id = m.convId
where c.convId in (443, 444) and
      m.id = (select max(id) from messages m2 where m2.convId = c.convId)
于 2013-05-26T15:54:37.633 回答
1

上面的顶级解决方案不适用于任何地方,例如 postgres 会给出错误,这是连接表的更好解决方案,并且只能从另一个表中获取最大 id:

SELECT conversations.*, m.* 
    FROM conversations 
    JOIN (SELECT cid, max(id) as m_id from messages group by cid) as m
        ON conversations.id = m.cid 
于 2019-04-24T09:25:40.830 回答