2014-05-22 27 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,AID發送器和FID的消息的接收器的ID的ID。消息本身就是消息。

我想選擇只有一次最高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 [「說」]

編輯2:消息系統應該是這個樣子,顯示在對話中發送的最後一條消息(就像在Facebook的)。

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

+1

我真的認爲你應該有一個對話ID和組,但是那些像'GROUP BY IF(AID> FID,CONCAT(AID,'|',FID),CONCAT(FID,'|',AID) )'? – h2ooooooo

+0

你是什麼意思的最高身份證的獨特組合? –

+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(MySQL的與Microsoft SQL Server等),但下面的代碼應該讓你在正確的方向前進修改......你可能需要修改字符串連接以使用某種類型的轉換或某種東西,但是,就像我所說的那樣,它與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