Таблица: статистика
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
сообщение varchar (100)
Правильны ли ваши данные образца и ожидаемый результат? потому что message3
предназначен для user1
.
Какая у вас версия mysql?
@ D-Shih версия mysql - 5.6, и да, образцы данных верны. Это сообщения, отправленные пользователем. Пользователь user1 отправил 2 сообщения: message1 и message3.
Пожалуйста, укажите, почему голосование против? Это помогает мне исправить мою ошибку в будущем.
Используйте 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.
Вы могли бы join
получить результат вашего group by
с полной таблицей (или наоборот)?
Или, в зависимости от того, что вы хотите, вы можете использовать group_concat()
, используя \n
в качестве разделителя.
Можете ли вы объяснить, как будет работать join в этом случае, если пользователь не будет повторяться
@Shubham См. Новый ответ Д-Ши в качестве примера.
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 |
каков размер столбца сообщения?