怎样才能按一个字段按值开始分组,例如。
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我该怎么分组?
发布于 2015-12-23 10:39:55
嗯,我在问题中读到了:按一个字段分组,从值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开始分组,并按user_name进行排序。
发布于 2015-12-23 10:33:12
这会给你你want....maybe的东西。它确实有效,但它依赖于从表中选择时以适当顺序返回的记录(这并不一定会发生)。
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变小时,它将一个分组值添加到分组值),然后根据用户名和分组值进行分组。
但实际上,您需要预先将分组值与数据一起存储。
发布于 2015-12-23 10:36:09
如果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
https://stackoverflow.com/questions/34433188
复制相似问题