2013-05-26 51 views
10

我得到了两个表格,对话和消息, 我想要做的是从对话到消息进行内部连接。通过内部连接获取最高ID并最大ID

这里是我的查询:

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 

我想获得最高的IDS只,如:

AND MAX(messages.id) 

但是,这并不工作

编辑: 我试过一次使用:

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

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

+0

您可以通过ID顺序邮件:ORDER BY conversations.id ASC,messages.id DESC – Nanocom

+0

,这将使我只有一行,我'd like a row per convId – Kilise

+0

不,它会给出多行。但我的错误,我应该写ORDER BY conversations.id ASC,messages.id DESC GROUP BY conversations.id – Nanocom

回答

12

编辑

这将工作!

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 
     ) 
+0

实际上这将无法正常工作,因为它只限于1行,我想要一行每conversations.id它在哪里messags.convId – Kilise

+1

中的最高ID因此,您只想检索每次对话的最新消息? –

+0

是这就是我想要的 – Kilise

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)