Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将mysql中的行分组为具有特定大小的块_Mysql_Sql - Fatal编程技术网

如何将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

如何将mysql中的行分组为具有特定大小的块

我有一个名为
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