首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何按字段值分组?

如何按字段值分组?
EN

Stack Overflow用户
提问于 2015-12-23 10:09:26
回答 3查看 113关注 0票数 1

怎样才能按一个字段按值开始分组,例如。

代码语言:javascript
复制
select * from t;
id, check_id, user_name
1,  0,        user_a
2,  1,        user_a
3,  2,        user_a
1,  0,        user_a
2,  1,        user_a
3,  3,        user_a
1,  0,        user_b
2,  1,        user_b
3,  3,        user_b

按check_id按起始值按每组0分组分组

代码语言:javascript
复制
user_name, check_info
user_a,    0-1-2
user_a,    0-1-3
user_b,    0-1-3

我该怎么分组?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-12-23 10:39:55

嗯,我在问题中读到了:按一个字段分组,从值0开始。

那你可以试试这个。

代码语言:javascript
复制
select user_name,group_concat(distinct check_id order by check_id asc separator '-') check_info
from (
    select id,check_id,user_name,
    case when check_id = 0 then
        @rn := @rn+1
    else
        @rn := @rn
    end as unique_id
    from t
    inner join (select @rn := 0) as tmp
    order by user_name
) as tbl
group by user_name,unique_id

这将按每条记录按0开始分组,并按user_name进行排序。

票数 0
EN

Stack Overflow用户

发布于 2015-12-23 10:33:12

这会给你你want....maybe的东西。它确实有效,但它依赖于从表中选择时以适当顺序返回的记录(这并不一定会发生)。

代码语言:javascript
复制
SELECT user_name, GROUP_CONCAT(check_id ORDER BY grouping, check_id SEPARATOR '-')
FROM
(
    SELECT id, check_id, user_name, @grouping:=if(id > @prev_id, @grouping, @grouping + 1) AS grouping, @prev_id:=id
    FROM t
    CROSS JOIN
    (
        SELECT @grouping:=0, @prev_id:=0
    ) sub0
) sub1
GROUP BY user_name, grouping

它的工作方式是返回行并使用变量将分组分配给它们(因此,当id变小时,它将一个分组值添加到分组值),然后根据用户名和分组值进行分组。

但实际上,您需要预先将分组值与数据一起存储。

票数 0
EN

Stack Overflow用户

发布于 2015-12-23 10:36:09

如果id是一个自动增量字段,则可以使用:

代码语言:javascript
复制
SELECT user_name, 
       GROUP_CONCAT(check_id ORDER BY check_id SEPARATOR '-') AS check_info
FROM (
SELECT id, check_id, user_name,
       @grp := IF (@uname = user_name,
                   IF (check_id = 0, @grp + 1, @grp),
                   IF (@uname := user_name, @grp + 1, @grp + 1)) AS grp
FROM mytable
CROSS JOIN (SELECT @grp := 0, @uname := '') AS vars
ORDER BY id) AS t
GROUP BY user_name, grp

变量用于标识每个user_name分区内由0开始的连续记录片。

Demo here

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34433188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档