2013-04-24 120 views
0

我們有一張表跟蹤我們的應用用戶之間發送的消息。每行有一個fromid,toid,messageiddatetime計算不同套發送/接收對

我想計算不同的用戶互相通信的對。另一種方法是計算用戶之間的不同「對話」,其中對話被簡單地定義爲兩個用戶之間發送的1個或更多消息。因此,舉一個具體的例子,對話可能是Fred向Bob發送2條消息,Bob向Fred發送3條消息。

fromid toid messageid datetime 
Fred Bob 123 2013-04-22 00:00:01 
Bob Fred 135 2013-04-22 00:01:02 
Fred Bob 238 2013-04-22 00:05:00 
Bob Fred 300 2013-04-22 00:09:13 
Bob Fred 312 2013-04-22 00:10:48 

這一切都將是1對話。對此進行查詢的有效方式是什麼(表格非常大)?

回答

2
SELECT COUNT(DISTINCT LEAST(fromID, toID), GREATEST(fromID, toID)) TotalConversation 
FROM messages 

輸出

╔═══════════════════╗ 
║ TOTALCONVERSATION ║ 
╠═══════════════════╣ 
║     1 ║ 
╚═══════════════════╝ 
+0

@downvoter,我想知道你是否理解這個問題。 – 2013-04-24 02:09:36

+0

謝謝!這比我打算做的更有效率(自我加入,亞達,亞達)。非常聰明。 – 2013-04-24 17:26:22

1

你可以嘗試涉及CONCAT功能,如一個小竅門:

SELECT DISTINCT CONCAT(fromid, '-', toid) AS 'conversation', 
     fromid, 
     toid, 
     ... 
    FROM table_name 
WHERE ... 
-1

在MySQL中,這將是

select count(distinct greatest(fromid, toid) + ':' + least(fromid, toid)) from messages; 

但是,我不認爲這是有效的方式做到這爲整個表在一個查詢。

相關問題