Mysql 分组排序数据
数据集:Mysql 分组排序数据,mysql,sql,group-by,group-concat,Mysql,Sql,Group By,Group Concat,数据集: id uid activity postid 1 20 A 1 2 20 A 1 3 6 A 1 4 3 A 1 5 6 A 1 6 13 A 1 7 13 B 1 8 18 B 1 9
id uid activity postid
1 20 A 1
2 20 A 1
3 6 A 1
4 3 A 1
5 6 A 1
6 13 A 1
7 13 B 1
8 18 B 1
9 18 B 1
10 1 A 1
id uid uid_list groupCount activity postid
9 18 18,13 3 B 1
1 20 1,13,6,3,20 7 A 1
id uid uid_list groupCount activity postid
9 18 18,13 3 B 1
10 1 1,13,6,3,20 7 A 1
当前结果:
id uid activity postid
1 20 A 1
2 20 A 1
3 6 A 1
4 3 A 1
5 6 A 1
6 13 A 1
7 13 B 1
8 18 B 1
9 18 B 1
10 1 A 1
id uid uid_list groupCount activity postid
9 18 18,13 3 B 1
1 20 1,13,6,3,20 7 A 1
id uid uid_list groupCount activity postid
9 18 18,13 3 B 1
10 1 1,13,6,3,20 7 A 1
预期结果:
id uid activity postid
1 20 A 1
2 20 A 1
3 6 A 1
4 3 A 1
5 6 A 1
6 13 A 1
7 13 B 1
8 18 B 1
9 18 B 1
10 1 A 1
id uid uid_list groupCount activity postid
9 18 18,13 3 B 1
1 20 1,13,6,3,20 7 A 1
id uid uid_list groupCount activity postid
9 18 18,13 3 B 1
10 1 1,13,6,3,20 7 A 1
我的问题是:
SELECT
id,
uid,
GROUP_CONCAT(DISTINCT uid ORDER BY id DESC) as uid_list,
COUNT(*) as groupCount,
activity,
postid
FROM (
SELECT *
FROM `user_activities`
ORDER BY id DESC) as tbl
GROUP BY
activity, postid
ORDER BY
id DESC
我想按
活动
和postid
进行分组,同时按id
按降序排列结果。并且希望每个组都有最新的id
和uid
。我不明白为什么这个查询没有返回预期的输出。据我所知,id
值正在增加。要获取最新值,可以使用聚合函数MAX()
此外,不需要使用排序的内部查询,因为引擎在为GROUP\u CONCAT()
生成结果时,必须按id
对结果集进行排序
要检索特定id
列的uid
,需要自联接到同一个表
SELECT
a.id, b.uid, a.uid_list, a.groupcount, a.activity, a.postid
FROM (
SELECT
MAX(id) as id,
GROUP_CONCAT(DISTINCT uid ORDER BY id DESC) as uid_list,
COUNT(*) as groupCount,
activity,
postid
FROM user_activities a
GROUP BY
activity, postid
) a
INNER JOIN user_activities b ON a.id = b.id
最简单的方法可能是
group\u concat()
/substring\u index()
技巧:
SELECT MAX(ID) as id,
SUBSTRING_INDEX(GROUP_CONCAT(uid ORDER BY ID DESC), ',', 1) as uid,
GROUP_CONCAT(DISTINCT uid ORDER BY id DESC) as uid_list,
COUNT(*) as groupCount,
activity, postid
FROM user_activities ua
GROUP BY activity, postid
ORDER BY id DESC;
这种方法有一些限制,因为
GROUP_CONCAT()
的中间值有一个最大长度。通常默认值已经足够了,但是如果有很多行与每个组匹配,您可能需要更改该值(而且您已经在uid
s列表中遇到了这个问题)。不,我无法获取MAX(uid)
,我需要最新的uid
(最新的是id
)。而且nouid
没有增加,它是来自另一个表的FK。我的坏消息。更新了答案。这是一个很好的方法,也解决了问题。但我很好奇,为什么它不在分组之前对行进行排序?甚至在我使用子查询方法对它们进行排序之后?这可能是因为您是按不在组\u concat
内的列进行排序的。请尝试将其更改为:按uid DESC区分uid顺序
。如果我理解正确,你不需要按id
排序。不,不,它会把一切搞糟:)我需要按id
排序。无论如何,感谢您提供的智能解决方案。组的默认长度是多少?@Shaharyar。我要强调的是,这会影响到您现有的组以及此处提出的第二个组。