我有一张代表对话的消息表:

| 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 )


但显然,这是行不通的。有什么我可以做的吗

最佳答案

您可以通过以下方式重新排列配对:先选择(发送者,接收者)的最小值,然后选择(发送者,接收者)的最大值,然后按这些值分组以获得每对的计数。尝试这个:

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

08-04 14:49