2012-03-12 9 views
3

私は2つのテーブルを持っています。mysqlは2つのテーブルをクエリし、各会話のメッセージを取得します

「会話」と呼ばれるものの1つに、次のデータがあります。

ConversationID Sender  Reciever 
1    bla1  bla2 
2    bla1  bla3 
3    bla1  bla4 

「メッセージ」とは、以下のデータがあります。我々は(時間によってソートDESC)各対話のための最新のコメントが必要であることを意味し

5    helo   2012-03-12 13:04:00   2 
4    helo   2012-03-12 13:03:00   3 
2    helo   2012-03-12 13:01:00   1 

MessageID MessageText TimeAddedMessage  ConversationID 
1    helo   2012-03-12 13:00:00   2 
2    helo   2012-03-12 13:01:00   1 
3    helo   2012-03-12 13:02:00   3 
4    helo   2012-03-12 13:03:00   3 
5    helo   2012-03-12 13:04:00   2 

私は、クエリから必要な結果は次のようです。

助けてください。

答えて

3

がしよう -

SELECT m2.*, c.Sender 
FROM (
    SELECT m1.ConversationID, MAX(m1.MessageID) AS MessageID 
    FROM Messages m1 
    GROUP BY m1.ConversationID 
) latest_msg 
INNER JOIN Messages m2 
    ON latest_msg.MessageID = m2.MessageID 
    AND latest_msg.ConversationID = m2.ConversationID 
INNER JOIN Conversations c 
    ON m2.ConversationID = c.ConversationID 
ORDER BY m2.MessageID DESC 

EDIT私は上記のクエリを変更しましたConversationsテーブルのSenderの値を含めます。私はあなたの会話の構造がちょっと奇妙であることに気付きました。会話は1人のユーザーから別のユーザーになりますが、どのユーザーが各メッセージを書いたのかを特定する方法はありません。これは意図的ですか?

+0

私はTimeAddedMessageの代わりにMessageIDを使用しています。これは、既にPKであり、同じ目的を果たす必要があるためです。 – nnichols

+0

すべての回答にお答えいただき、ありがとうございました。私はこれを使い始めました。私の問題は、会話テーブル(bla1)からユーザーの名前が必要なことです。私は私の質問でそれを言及するのを忘れました。 1つのクエリでこれが可能ですか? – stefanosn

+1

上記のクエリにSenderを追加しました。 [MySQL JOINの構文](http://dev.mysql.com/doc/refman/5.0/en/join.html) – nnichols

1

あなたははconversationIdとmax TimeAddedMessageと派生テーブルを作成し、バックのメッセージに、それに参加することによってそれを行うことができます。

select Messages.MessageID, Messages.MessageText, 
     Messages.TimeAddedMessage, Messages.ConversationID 
    from Messages inner join 
    (
    select ConversationID, max (TimeAddedMessage) TimeAddedMessage 
     from Messages 
    group by ConversationID 
) LastMessages 
    on Messages.ConversationID = LastMessages.ConversationID 
    and Messages.TimeAddedMessage = LastMessages.TimeAddedMessage 
1

比較的小さなデータセットに対して優れたパフォーマンスを持つ簡単なクエリです。

SELECT m1.* 
FROM Messages m1 LEFT JOIN Messages m2 
ON (m1.ConversationId = m2.ConversationId AND m1.TimeAddedMessage < m2.TimeAddedMessage) 
WHERE m2.MessageID IS NULL; 

this postから変更されました。

これは直感的ではありませんが、しばしばよく使われる料理レシピになりました。

+0

あなたが参照しているページをさらに読むと、大きなデータセットの場合にこのメソッドが悪くなることがわかります。 – egrunin

+0

このクエリのパフォーマンスは、グループのサイズに大きく依存します。会話中のメッセージの数が常に比較的少ない場合、これはINNER JOINよりも速くなる可能性があります。 – nnichols

+0

あなたのコメントに応じて更新された応答 – cmc

関連する問題