我有一张代表对话的消息表:
| 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);