MySQL查询的数量,按分组

时间:2018-08-10 11:29:03

标签: mysql group-by

表:统计数据

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    

5 个答案:

答案 0 :(得分:2)

您似乎想显示Count发送的usermessageuser发送。

如果您的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