如何按值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
我该如何分组?
答案 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
分区内标识连续记录的切片。
答案 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分组,并按用户名排序。