0

我们有一个表格来跟踪我们应用程序用户之间发送的消息。每行都有一个fromid, toid, messageid, 和datetime

我想计算相互通信的不同用户对。另一种说法是计算用户之间不同的“对话”,其中对话被简单地定义为两个用户之间发送的一条或多条消息。因此,举一个具体的例子,一个对话可能是 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 次对话。对此进行查询的有效方法是什么(表非常大)?

4

3 回答 3

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

输出

╔═══════════════════╗
║ TOTALCONVERSATION ║
╠═══════════════════╣
║                 1 ║
╚═══════════════════╝
于 2013-04-24T01:19:12.063 回答
1

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

SELECT DISTINCT CONCAT(fromid, '-', toid) AS 'conversation',
       fromid,
       toid,
       ...
  FROM table_name
 WHERE ...
于 2013-04-24T01:15:57.543 回答
-1

在 MYSQL 中,那将是

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

但是,我认为没有一种有效的方法可以在一个查询中为整个表执行此操作。

于 2013-04-24T01:23:15.920 回答