Mysql 使用 OR 按 2 列分组
Mysql group by 2 columns using OR
我有 table 条代表对话的消息:
| sender | bigint(20) unsigned | NO | MUL | NULL | |
| recipient | bigint(20) unsigned | NO | MUL | NULL | |
| text | text | NO | | NULL | |
每一行都有发件人、收件人和邮件正文。
我想运行查询returns所有对话以及每个对话中的消息数。
因此,如果数据如下所示:
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 )
但显然,那是行不通的。有什么类似的我可以做吗
您可以重新排列配对,方法是先选择 (sender, recipient) 的最小值,然后选择 (sender, 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);
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
希望对您有所帮助
我有 table 条代表对话的消息:
| sender | bigint(20) unsigned | NO | MUL | NULL | |
| recipient | bigint(20) unsigned | NO | MUL | NULL | |
| text | text | NO | | NULL | |
每一行都有发件人、收件人和邮件正文。
我想运行查询returns所有对话以及每个对话中的消息数。
因此,如果数据如下所示:
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 )
但显然,那是行不通的。有什么类似的我可以做吗
您可以重新排列配对,方法是先选择 (sender, recipient) 的最小值,然后选择 (sender, 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);
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
希望对您有所帮助