具有计数、分组依据的MySQL查询

具有计数、分组依据的MySQL查询,mysql,group-by,Mysql,Group By,表:统计数字 id | user | Message ---------------------- 1 | user1 |message1 2 | user2 |message2 3 | user1 |message3 我能够找到使用此查询的每个用户发送的邮件数 select user, count(*) from statistics group by user; 如何显示消息列数据和计数?比如说 user | count | message ---------------

表:统计数字

id | user  | Message
----------------------
1  | user1  |message1 
2  | user2  |message2
3  | user1  |message3
我能够找到使用此查询的每个用户发送的邮件数

select user, count(*) from statistics group by user;
如何显示消息列数据和计数?比如说

user | count | message
------------------------
user1| 2     |message1
             |message3
user2| 1     |message2    
使用组_concat

select user, count(0) as ct,group_concat(Message) from statistics group by user;
Group_concat(Message SEPARATOR '----')
这将为您提供csv格式的消息

注意:在mysql中,GROUP_CONCAT的默认大小限制为1024个字符

对于UTF,它转到1024/3和utfmb4 2551024/4

您可以使用group_concat_max_len全局变量根据需要设置其最大长度,但要考虑生产环境中的内存因素

SET group_concat_max_len=100000000
更新:

您可以使用组_concat中的任何分隔符

select user, count(0) as ct,group_concat(Message) from statistics group by user;
Group_concat(Message SEPARATOR '----')
您可以使用完整的表格加入您的组的结果,或者反之亦然


或者,根据需要,您可以使用组\u concat,使用\n作为分隔符。

尝试使用自连接进行分组:

select user, count(*) as 'total' , group_concat(message) from statistics group by user;
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
您似乎希望按用户显示Count,即用户发送的消息

如果您的mysql版本不支持窗口功能,您可以在select子查询中进行子查询以生成行号,然后只显示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:

:


消息列的大小是多少?消息varchar100示例数据和预期结果是否正确?因为message3是针对user1的。您的mysql版本是什么?@D-Shih mysql版本是5.6,是的示例数据是正确的。这是用户发送的消息。user1已发送了两条消息:message1和message3。是否可以在下一行而不是csv中获取输出,因为message列已经有逗号,并且很难用group_concat的逗号进行解析。如果用户不需要,您能否解释在这种情况下join将如何工作repeated@Shubham例如,见D-Shih的新答案。