2014-07-04 4 views
1

해결해야 할 약간의 문제가 있지만 그렇게 할 수 없습니다.MySQL : 각 쌍의 마지막 행을 선택하십시오.

id  user friend  msg      date 
---------------------------------------------------------------------- 
1  1  2   Hello Bob!    2014-07-04 01:00 
2  1  2   How are you doing?  2014-07-04 01:01 
3  2  1   I'm fine bro!   2014-07-04 02:30 
4  1  3   Hey Mark :D    2014-07-04 02:31 
5  3  1   Yo!      2014-07-04 02:32 
6  4  1   Wassup?!    2014-07-04 07:00 

나는 각 쌍 (사용자와 친구)의 마지막 메시지의 배열을 반환하는 PHP getInbox($uid) 방법에 일하고 있어요 : 나는 다음과 같은 chat 테이블이 있습니다. GROUP BY friend과 함께 SELECT 쿼리를 시도했지만 불완전합니다.

SELECT * FROM `chat` 
GROUP BY `friend` 
WHERE `user` = $uid OR `friend` = $uid 

원하는 결과는 다음과 같습니다

id  user friend  msg      date 
---------------------------------------------------------------------- 
3  2  1   I'm fine bro!   2014-07-04 02:30 
5  3  1   Yo!      2014-07-04 02:32 
6  4  1   Wassup?!    2014-07-04 07:00 

내가 도움을 주셔서 감사합니다 것입니다!

+0

"스레드"또는 "대화"식별자가 있다면이 방법이 훨씬 쉽습니다. 간단한 방법은 모든 응답의 "상위"를 체인의 첫 번째로 설정 한 다음 각 체인의 마지막을 선택하는 것입니다. – tadman

+0

그래서'4,1,3'은 "mark"메시지이고, 5,3,1은 mark의 회신이라고 생각하십니까? –

+0

나는 그것에 대해 생각하고, 대화'대화 '를 만들고 각 대화 행에 외래 키를 설정했습니다. 하지만 하나의 테이블로 시험해보고 싶습니다. – bodruk

답변

3
SELECT c.* FROM 
chat c 
JOIN 
(SELECT 
    max(id) max_id, 
    (CASE WHEN user < friend THEN user ELSE friend END) user_a, 
    (CASE WHEN user < friend THEN friend ELSE user END) user_b 
FROM chat 
    GROUP BY user_a, user_b) t1 ON t1.max_id = c.id 

case 문은 (user, friend)를 오름차순으로 선택합니다. 예를 들어, (1,2)와 (2,1)은 (1,2)로 변환됩니다. 순서쌍은 대화를 고유하게 식별합니다. 마지막으로 각 순서쌍에 대해 최신 ID가 선택되고 해당 ID를 갖는 행이 채팅 테이블에서 표시됩니다.

+0

그것은 작동합니다! 감사. 의견을 추가하거나 논리를 설명해 주시겠습니까? – bodruk

+1

설명과 함께 @drux 업데이트 됨 – FuzzyTree

관련 문제