2013-05-26 90 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)