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
)。而且no
uid
没有增加,它是来自另一个表的FK。我的坏消息。更新了答案。这是一个很好的方法,也解决了问题。但我很好奇,为什么它不在分组之前对行进行排序?甚至在我使用子查询方法对它们进行排序之后?这可能是因为您是按不在
组\u concat
内的列进行排序的。请尝试将其更改为:
按uid DESC区分uid顺序
。如果我理解正确,你不需要按
id
排序。不,不,它会把一切搞糟:)我需要按
id
排序。无论如何,感谢您提供的智能解决方案。
组的默认长度是多少?@Shaharyar。我要强调的是,这会影响到您现有的
组以及此处提出的第二个组。