MySQL Query с подсчетом, сгруппировать по

Таблица: статистика

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    

каков размер столбца сообщения?

Shubham 10.08.2018 13:29

сообщение varchar (100)

Santosh 10.08.2018 13:30

Правильны ли ваши данные образца и ожидаемый результат? потому что message3 предназначен для user1.

D-Shih 10.08.2018 13:37

Какая у вас версия mysql?

D-Shih 10.08.2018 13:42

@ D-Shih версия mysql - 5.6, и да, образцы данных верны. Это сообщения, отправленные пользователем. Пользователь user1 отправил 2 сообщения: message1 и message3.

Santosh 10.08.2018 14:14

Пожалуйста, укажите, почему голосование против? Это помогает мне исправить мою ошибку в будущем.

Santosh 10.08.2018 14:20
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
6
63
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Используйте Group_concat

select user, count(0) as ct,group_concat(Message) from statistics group by user;

Это даст вам сообщение в формате csv

ПРИМЕЧАНИЕ: GROUP_CONCAT имеет ограничение на размер 1024 символа по умолчанию в mysql.

Для UTF это 1024/3 и utfmb4 255 (1024/4).

Вы можете использовать глобальную переменную group_concat_max_len, чтобы установить ее максимальную длину в соответствии с потребностями, но принять во внимание соображения памяти в производственной среде.

SET group_concat_max_len=100000000

Обновлять:

Вы можете использовать любой разделитель в group_concat

Group_concat(Message SEPARATOR '----')

Можно ли получить вывод в следующей строке вместо csv, поскольку в столбце «сообщение» уже есть «запятая», и его трудно разобрать по «запятой» group_concat.

Santosh 10.08.2018 13:41

Вы могли бы join получить результат вашего group by с полной таблицей (или наоборот)?

Или, в зависимости от того, что вы хотите, вы можете использовать group_concat(), используя \n в качестве разделителя.

Можете ли вы объяснить, как будет работать join в этом случае, если пользователь не будет повторяться

Shubham 10.08.2018 13:47

@Shubham См. Новый ответ Д-Ши в качестве примера.

Danny_ds 10.08.2018 14:06
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 от 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

Результаты:

| users | count |  message |
|-------|-------|----------|
| user1 |     2 | message1 |
|       |       | message3 |
| user2 |     1 | message2 |

Другие вопросы по теме