0

Facebookチャットに少し似たチャットアプリケーションを構築しています。ユーザー、会話、メッセージがあります。3つすべてに独自のテーブルがあります。今のところ、特定のユーザーと会話の最新のメッセージを含むすべての会話を取得しようとしています。

このクエリを試してみましたが、実際には1行しか返されませんが、一致する行は他にもあります

SELECT conversations.id as converid,
       messages.from as messageauthor,
       messages.message as message 
FROM conversations INNER JOIN (SELECT * FROM messages 
                               ORDER BY date DESC LIMIT 1) as messages 
ON messages.conversationid=conversations.id 
WHERE user1=3 
OR user2=3

私がするとき、すなわち

SELECT conversations.id as converid,
           messages.from as messageauthor 
FROM conversations INNER JOIN  messages 
ON messages.conversationid=conversations.id 
WHERE user1=3 
OR user2=3

確かにすべての結果が得られ、conveid をチェックすると 3 つの一意の ID が得られるため、少なくとも userid 3 で 3 つの会話が行われます。したがって、トップ クエリも 3 を返す必要があります。理由がわかりません。 1 行のみを返します。limit 1ネストされたクエリはクエリ全体に影響しますか?

いくつかの指針を楽しみにしています...

4

1 に答える 1

1

いいえ。これlimit 1はサブクエリに影響するため、1 行しか返されません。したがって、一致するのは 1 つだけです。

このクエリの問題は何ですか (2 番目のクエリですが、形式が異なります):

SELECT c.id as converid, m.from as messageauthor 
FROM conversations c INNER JOIN 
     messages m
     ON m.conversationid=c.id 
WHERE user1=3 OR user2=3;

なるほど、最新のメッセージが必要ですか。それを計算して、再び参加してみてください:

SELECT c.id as converid, m.from as messageauthor 
FROM conversations c INNER JOIN 
     messages m
     ON m.conversationid=c.id join
     (select m.conversationid, max(date) as maxdate
      from messages m
      group by m.conversationid
     ) mmax
     on mmax.conversationid = m.conversationid and m.date = mmax.maxdate
WHERE user1=3 OR user2=3;
于 2013-06-24T15:58:46.313 に答える