如何在 SQL 中按多个列中的值进行分组?

How do I group by values in multiple columns in SQL?

提问人:ANIRUDH JAKHAR 提问时间:11/11/2023 最后编辑:Adrian MaxwellANIRUDH JAKHAR 更新时间:11/11/2023 访问量:51

问:

想象一下一张看起来像this:

| | | |,说表名是现在我要写一个SQL查询,给我:,。所以基本上如果 id = 12 发送了 3 条消息并收到了 5 条消息,结果将是:12,8sender_IDReceiver_IDmessage_ID**tb**user_idTotal messages exchanged by that user

我不确定是否

Select COUNT(MESSAGE_ID)
from tb
group by sender_id, reciever_id 

但这显然是错误的

sql mysql select group-by sum

评论

1赞 Jonas Metzler 11/11/2023
请阅读这篇文章:stackoverflow.com/help/minimal-reproducible-example,然后按照那里的解释去做
0赞 GotStu 11/11/2023
选择 user_id, count(message_id) from tb where user_id = 12 group by user_id
0赞 Barmar 11/11/2023
@GotStu 没有列。user_id

答:

0赞 Barmar 11/11/2023 #1

用于在一列中合成所有发送方和接收方的表。然后,您可以将其加入以计算两个ID。UNIONtb

WITH users AS (
    SELECT sender_id AS id
    FROM tb
    UNION DISTINCT
    SELECT receiver_id AS id
    FROM tb
)
SELECT u.id, COUNT(*) AS message_count
FROM users u
JOIN tb ON u.id IN (tb.sender_id, tb.receiver_id)
GROUP BY u.id
0赞 Isolated 11/11/2023 #2

此版本也使用 CTE 创建单列users_ids,只有两个表扫描。

with cte as (
  select sender_id as user_id, message_id 
  from tb
  union
  select receiver_id, message_id
  from tb
  )
select user_id, count(message_id) as messages
from cte
group by user_id
order by user_id;
user_id 消息
3601 4
4500 3
8752 1