2015-11-04 54 views
0

我具有表示會話的消息的表:Mysql的基團OR

| sender  | bigint(20) unsigned | NO | MUL | NULL |  | 
| recipient | bigint(20) unsigned | NO | MUL | NULL |  | 
| text  | text    | NO |  | NULL |  | 

每一行都有一個發送者,接收者和消息的文本。

我想運行一個查詢,該查詢返回每個對話中的所有對話和消息數。

因此,如果數據的模樣:

1,2,Hello 
2,1,Bye 
1,3,Hi 

我想知道的是1和2之間的對話有2個消息,以及1和3之間的對話有1個消息

所以我需要做類似

SELECT count(*), SET OF(sender, recipient) from messages group by (sender OR recipient) 

但顯然,這是行不通的。是否有類似的事我可以做

+1

開始:'選擇發件人用戶1,用戶2收件人從MY_TABLE UNION選擇收件人,發送者my_table' ...或在這裏'SELECT LEAST(發件人,收件人)user1,GREATEST(發件人,收件人)user2 FROM my_table;' – Strawberry

回答

3

您可以通過先選擇(發件人,收件人)的最小值,然後選擇(發件人,收件人)的最小值並將它們分組以獲得每對的計數來重新排列配對。試試這個:

SELECT LEAST(sender, recipient) AS firstPerson, GREATEST(sender, recipient) AS secondPerson, COUNT(*) AS numMessages 
FROM myTable 
GROUP BY LEAST(sender, recipient), GREATEST(sender, recipient); 
+0

SQL小提琴沒有加載,所以這是未經測試的,但我希望這可以幫助。 – AdamMc331

0
SELECT sender_reciever,COUNT(*) AS message_count 
    FROM 
    (SELECT (IF(sender>recipient,CONCAT(sender,'_',recipient),CONCAT(recipient,'_',sender))) AS sender_reciever 
    FROM 
    message_table) T 
    GROUP BY sender_reciever 

希望這有助於在這裏