2016-12-01 6 views
0

私は2つのテーブルchatschats_replyを持っています。構造は以下の通りです。最後のメッセージを取得返信会話

チャット

-------------------------------------------------- 
| chat_id | user_one | user_two | created_at 
-------------------------------------------------- 
| 1  | 1   | 2   | something here 
-------------------------------------------------- 

chats_reply

------------------------------------------------------------------------- 
| chatReply_id | chat_id | user_id | reply   | created_at 
------------------------------------------------------------------------- 
| 1   | 1   | 1   | Message 1  | something here 
------------------------------------------------------------------------- 
| 2   | 1   | 2   | Message 2  | something here 
------------------------------------------------------------------------- 

私は私のクエリに問題のビットを持っています。私のuser_idが1であるとしましょう。送信された最後のメッセージを含むすべてのチャットのリストを返したいと思います。私はすでにすべてのチャットを一覧表示するクエリを持っていますが、最後のメッセージを返しません。問題は、私はそれがMessage 2を返すようにしたいとき、それはchats_replyテーブルからMessage 1を返すあり、

SELECT 
     chats.chat_id, 
     chats.created_at AS ChatTime, 
     chats_reply.reply, 
     chats_reply.created_at AS ReplyTime, 
     chats_reply.status, 
     users.name, 
     users.last_name, 
     users.email 

FROM chats 

INNER JOIN chats_reply 
ON chats.chat_id = chats_reply.chat_id 

INNER JOIN users 
ON users.user_id = 
    CASE 
     WHEN chats.user_one = '1' 
      THEN chats.user_two 
     WHEN chats.user_two = '1' 
      THEN chats.user_one 
    END 

WHERE chats.user_one = '1' OR chats.user_two = '1' 

GROUP BY chats_reply.chat_id 

ORDER BY chats_reply.chatReply_id DESC 

このクエリは、私が期待するすべてのものを返します。これは私のクエリです。どんな助けでも大歓迎です。

答えて

2

フィルタリングにWHEREを使用してください。いいえGROUP BY

SELECT c.chat_id, c.created_at AS ChatTime, 
     cr.reply, cr.created_at AS ReplyTime, cr.status, 
     u.name, u.last_name, u.email 
FROM chats c INNER JOIN 
    chats_reply cr 
    ON c.chat_id = cr.chat_id INNER JOIN 
    users u 
    ON (u.user_id = c.user_two AND c.user_one = 1) OR 
     (u.user_id = c.user_one AND c.user_two = 1) 
WHERE 1 IN (c.user_one, c.user_two) AND 
     cr.chatReply_id = (SELECT MAX(cr2.chatReply_id) 
         FROM chat_reply cr2 
         WHERE cr2.chat_id = cr.chat_id 
         ); 
+0

ありがとう!出来た。しかし、あなたの質問に「WHERE」の部分を説明してください。再度、感謝します。 –

+1

@ ExoSkeleton321。 。 。単にチャットごとに最新の 'chatReply_id'を選択するだけです。これが相関サブクエリの仕組みです。 –

+0

ええ、私はもっとそれを見ていくつもりです、ありがとう! –

関連する問題