我如何按字段值进行分组?

时间:2015-12-23 10:09:26

标签: mysql

如何按值0将一个字段分组     例如

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开始

user_name, check_info
user_a,    0-1-2
user_a,    0-1-3
user_b,    0-1-3

我该如何分组?

3 个答案:

答案 0 :(得分:0)

这会给你你想要的......也许吧。它确实有效,但是当从表中选择时,它依赖于以适当顺序返回的记录(并且不一定会发生)。

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变小时,它会为分组值添加一个),然后对用户名和分组值执行GROUP BY。

但实际上你需要事先将分组值存储在数据中。

答案 1 :(得分:0)

如果id自动增量字段,那么您可以使用:

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

答案 2 :(得分:0)

好吧,我在问题中读到:按一个字段开始按值0开始

然后,你可以试试这个。

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分组,并按用户名排序。