2014-05-22 4 views
0

나는이한 번만

ID AID FID MESSAGE 
1 1  2  Hi 
2 2  1  Hi, how are you? 
3 3  1  Hello One, what's up? 
4 1  2  I'm fine, how about you? 

ID 같은 테이블과 메시지 시스템을 가지고 고유 메시지 ID이며, 송신기와 FID 메시지의 수신자의 ID의 ID를 AID. 메시지는 메시지 자체입니다. 출력은 다음과 같습니다 있도록

나는 한 번만 가장 높은 ID, 하지만으로 모든 고유 조합을 선택합니다 :

ID AID FID MESSAGE 
3 3  1  Hello One, what's up? 
4 1  2  I'm fine, how about you? 

문제는 내가 AID = 2로 제대로 선택하지 수 있다는 것입니다 FID = 1은 FID = 1 및 AID = 2와 같이 고유하지만 실제로는 같은 대화입니다.

모든 의견은 매우 높이 평가됩니다.

편집 : 메시지 시스템이 대화에서 보낸 마지막 메시지를 표시의 모양은 (방금처럼 : 현재 로그인 한 사용자의 ID는 $ _SESSION

EDIT 2가 "며"]입니다 페이 스북).

http://i.stack.imgur.com/Jmvfr.jpg

+1

정말 당신이 대화 ID와 그룹을 가지고 있어야한다고 생각합니다. 그러나'GROUP BY IF (AID> FID, CONCAT (AID, '|', FID), CONCAT (FID, '|', AID))'? – h2ooooooo

+0

가장 높은 ID를 가진 고유 한 조합은 무엇을 의미합니까? –

+0

어떤 RDBMS를 사용하고 있습니까? –

답변

2

입니다 쿼리 :

select * from table 
where ID in (
    select max(id) as maxid 
    from table 
    group by LEAST(aid, fid), GREATEST(aid, fid) 
) 

만 /에 $ _SESSION에서 사용할 수있는 [ "며"] 마지막 메시지를 선택하려면 :

$query = "select * from table 
where ID in (
    select max(id) as maxid 
    from table 
    where aid = ".$_SESSION["said"]." or fid = ".$_SESSION["said"]." 
    group by LEAST(aid, fid), GREATEST(aid, fid) 
)"; 

이 사용자와주고받는 모든 최신 메시지의 목록을 제공합니다.

+0

대단히 고마워요, 매력처럼 작동합니다! 나는 정말로 "group by"및 "join"진술을 배워야한다고 생각합니다. – user3666136

1

당신은 아마해야합니다 ... 그것이 당신의 RDBMS (마이크로 소프트 SQL 서버 등 대 MySQL을)에 따라하지만, 다음과 같은 코드가 올바른 방향으로 가고 가야 수정해야 할 수도 있습니다 일종의 캐스트 또는 무언가를 사용하도록 문자열 연결을 수정하지만, 말했듯이 RDBMS에 의존적입니다.

의사 코드 :

여기
select * 
from have 
where id in 
(
    select max(id) as topid 
    from have 
    group by case when aid<fid then aid+'|'+fid else fid+'|'+aid end 
) 
+0

MySQL을 사용하고 있습니다 – user3666136

+0

Lashane의 대답은 똑같습니다. 그것은 당신을 위해 작동합니다. –

+0

어쨌든 고마워요, 존! :) – user3666136