如何将mysql中的行分组为具有特定大小的块
如何将mysql中的行分组为具有特定大小的块 我有一个名为如何将mysql中的行分组为具有特定大小的块,mysql,sql,Mysql,Sql,如何将mysql中的行分组为具有特定大小的块 我有一个名为users 其中包含这些字段idname 我想做一个查询,将用户分组为每行3个名称的chuck 样本表: 1 name1 2 name2 3 name4 4 name5 5 name5 6 name6 7 name7 结果应该是 name1,name2,name3 name4,name5,name6 name7 使用ignGROUP\u CONCAT当然要做到这一点您可以使用模运算和条件聚合得到三列: select max(case
users
其中包含这些字段id
name
我想做一个查询,将用户分组为每行3个名称的chuck
样本表:
1 name1
2 name2
3 name4
4 name5
5 name5
6 name6
7 name7
结果应该是
name1,name2,name3
name4,name5,name6
name7
使用ign
GROUP\u CONCAT
当然要做到这一点您可以使用模运算和条件聚合得到三列:
select max(case when mod(id, 3) = 1 then name end),
max(case when mod(id, 3) = 2 then name end),
max(case when mod(id, 3) = 0 then name end)
from users u
group by floor((id - 1) / 3);
或者,如果只需要一列,请使用group\u concat()
:
这两种解决方案都假设id
增加1,没有间隙。如果没有,则可以使用变量指定序列号
SELECT
GROUP_CONCAT(name SEPARATOR ',')
FROM users
GROUP BY
floor((id - 1) / 3);
下面是一个SQL小提琴,演示了这一点:
如果ID未升序或未成功,则此查询可能是:
SELECT names from (
SELECT GROUP_CONCAT(name) as names,
@rownum := @rownum + 1 AS rank
FROM users u,
(SELECT @rownum := 0) r
GROUP BY floor(@rownum / 3)
) _users ;
再次拉小提琴:
这是一个很酷的答案gordon-nb在DB2/Oracle中,您可以使用Listag(),就是这样:)非常感谢。这很优雅,但基于
id
value-所以如果id不一致,它可能会中断。您是对的,我在阅读您的评论之前就意识到了这一点,因此,我开始编写一个基于行数的新查询,海报也应该考虑这个查询。
SELECT names from (
SELECT GROUP_CONCAT(name) as names,
@rownum := @rownum + 1 AS rank
FROM users u,
(SELECT @rownum := 0) r
GROUP BY floor(@rownum / 3)
) _users ;
SELECT GROUP_CONCAT(name),
(IF(@i = 3 OR @i IS NULL, @i:=1, @i:=@i+1 ))as idx,
(IF(@gr_idx IS NULL, @gr_idx:=1, IF(@i = 1, @gr_idx:=@gr_idx+1,@gr_idx) )) as gr_idx
FROM users
GROUP BY gr_idx