2013-05-26 15 views
10

私は2つのテーブル、会話とメッセージを持っています 私がしたいのは、会話からメッセージへの内部結合を行うことです。ここで内部結合と最大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

:あなたはまた、より標準的な手法を用いてこれを行うことができます

conversations.id ASC BY ORDERを、DESC – Nanocom

+0

messages.id私に一つだけの行を与えること、私コンボごとに行が好きです。 – Kilise

+0

いいえ、複数の行が表示されます。しかし、私の間違いは、私はORDER BY conversations.id ASC、messages.id DESC GROUP BY conversations.id – Nanocom

答えて

12

EDIT

これは動作します!

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行だけに制限されているcuz、私はconversations.idあたりの行が欲しいmessags.convIdの最高のID – Kilise

+1

あなたは会話ごとに最新のメッセージを取得したいだけですか? –

+0

はい私はほしいと思うものを正確に – Kilise

2

グループ内の最大値を探しています。 MySQLにはこれを行うための本当に明白な方法はありません(トリッキーな方法でたくさんの方法があります)。

しかし、あなたは2つのグループのみを探しています。そのように、あなただけのグループごとに上限を探し、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)のインデックスを持っている場合は、これは非常に高速である必要があります。あなたが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) 
関連する問題