通过内部联接和最大ID获取最高ID

时间:2013-05-26 15:43:32

标签: php mysql sql database

我有两张桌子,对话和消息, 我想做的是从对话到消息进行内部联接。

这是我的问题:

    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) 

但我得到一个错误说:组功能的使用无效。

3 个答案:

答案 0 :(得分:15)

修改

这会有效!

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
        )

答案 1 :(得分: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)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)

答案 2 :(得分: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