表:统计数据
id | user | Message
----------------------
1 | user1 |message1
2 | user2 |message2
3 | user1 |message3
我能够使用此查询找到每个用户发送的邮件数。
select user, count(*) from statistics group by user;
如何显示 message 列数据以及计数?例如
user | count | message
------------------------
user1| 2 |message1
|message3
user2| 1 |message2
答案 0 :(得分:2)
您似乎想显示Count
发送的user
,message
由user
发送。
如果您的mysql版本不支持窗口功能,则可以进行子查询以在选择子查询中创建row_number
,然后仅显示rn=1
个用户并计数
CREATE TABLE T(
id INT,
user VARCHAR(50),
Message VARCHAR(100)
);
INSERT INTO T VALUES(1,'user1' ,'message1');
INSERT INTO T VALUES(2,'user2' ,'message2');
INSERT INTO T VALUES(3,'user1' ,'message3');
查询1 :
SELECT (case when rn = 1 then user else '' end) 'users',
(case when rn = 1 then cnt else '' end) 'count',
message
FROM (
select
t1.user,
t2.cnt,
t1.message,
(SELECT COUNT(*) from t tt WHERE tt.user = t1.user and t1.id >= tt.id) rn
from T t1
join (
select user, count(*) cnt
from T
group by user
) t2 on t1.user = t2.user
) t1
order by user,message
Results :
| users | count | message |
|-------|-------|----------|
| user1 | 2 | message1 |
| | | message3 |
| user2 | 1 | message2 |
答案 1 :(得分:1)
您可以将join
的结果与完整表格一起使用(反之亦然)吗?
或者,根据您的需要,可以使用group by
作为分隔符来使用group_concat()
。
答案 2 :(得分:1)
select user, count(*) as 'total' , group_concat(message) from statistics group by user;
答案 3 :(得分:0)
使用Group_concat
select user, count(0) as ct,group_concat(Message) from statistics group by user;
这将为您提供csv格式的消息
注意:在MySQL中,默认情况下GROUP_CONCAT的大小限制为1024个字符。
对于UTF,它转到1024/3,而utfmb4 255(1024/4)。
您可以根据需要使用group_concat_max_len全局变量设置其最大长度,但要考虑生产环境中的内存注意事项
SET group_concat_max_len=100000000
更新:
您可以在group_concat中使用任何分隔符
Group_concat(Message SEPARATOR '----')
答案 4 :(得分:0)
尝试使用自我加入进行分组:
select s1.user, s2.cnt, s1.message
from statistics s1
join (
select user, count(*) cnt
from statistics
group by user
) s2 on s1.user = s2.user