计算发送/接收对的不同集合

时间:2013-04-24 01:09:17

标签: mysql sql

我们有一个表格,可以跟踪我们应用用户之间发送的消息。每行都有fromidtoidmessageiddatetime

我想计算彼此沟通的不同用户对。另一种方法是计算用户之间的不同“对话”,其中对话简单地定义为在两个用户之间发送的一条或多条消息。因此,举一个具体的例子,谈话可能是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

这一切都是一次对话。对此进行查询的有效方法是什么(表格非常大)?

3 个答案:

答案 0 :(得分:2)

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

输出

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

答案 1 :(得分:1)

您可以尝试一些涉及CONCAT功能的小技巧,例如:

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

答案 2 :(得分:-1)

在MYSQL中,那将是

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

但是,我认为在一个查询中没有有效的方法为整个表做这件事。