2016-12-01 3 views
0

그래서 두 테이블 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

흠, 더 살펴 보겠습니다. 고마워요! –

관련 문제