如何将多行分组并连接成每组20个的形式

3

我有一个只有数字ID的表格

ID
1
2
3
4
5
6
7
8
9
10

我希望您能够将这些id分为每组5个或20个进行拆分和连接。

GROUPS
1,2,3,4,5
6,7,8,9,10
11,12,13,14,15

我该如何用SQL实现这个功能?

更新:

按排序后的ID进行查询

  SELECT GROUP_CONCAT(id ORDER BY id) AS GROUPS
  FROM `test`
  GROUP BY (id - 1) DIV 5

结果:

  GROUPS
  1,2,3,4,5
  6,7,8,9,10
  11,12,13,14,15
  16,17,18,19,20
  21,22,23,24,25
  26,27,28,29,30
  31,32,33,34,35

使用第二个未排序的表进行SELECT查询

  SELECT GROUP_CONCAT(id ORDER BY id) AS GROUPS
  FROM `test2`
  GROUP BY (id - 1) DIV 5

结果:

  GROUPS
  3,5
  10
  12
  16
  23,24,25
  32,35
  43,44
  47
  55
  61
  68,70
  77
  84
  89
  91,92,95
  97,100

1
你使用哪个关系型数据库?你想把这些值放在一个单独的列中,其中包含 n 个 ID,用逗号分隔吗? - p.campbell
1
这些ID保证没有间隙并从1开始吗? - Mark Byers
第一个答案非常好用,但只有在ID已排序且没有缺失的情况下才有效,而这不是我的情况: - Rodrigo Polo
不,ID并不能保证没有间隔,我猜必须有一种方法可以通过项的计数()进行分组或在选择中创建一个具有相关数字的额外列。 - Rodrigo Polo
2个回答

3

对于MySQL:

SELECT GROUP_CONCAT(id ORDER BY id) AS GROUPS
FROM yourtable
GROUP BY (id - 1) DIV 5

查看它在线运行:SQL Fiddle

如果ID是按顺序排列的,您的代码运行得很好,否则它就无法正常工作。我尝试了通过添加一个顺序行计数器来解决这个问题,但它的表现很奇怪:SET @rank=0;<br/> SELECT<br/> id,<br/> @rank:=@rank+1 AS rank,<br/> GROUP_CONCAT(id ORDER BY id) AS GROUPS<br/> FROM test2<br/> group by cast(rank/5 as signed)<br/> - Rodrigo Polo

2

对于未排序的ID:

SET @rank=0;
SELECT
    id,
    @rank:=@rank+1 AS rank,
    GROUP_CONCAT(id ORDER BY id) AS GROUPS
FROM  `test2`
GROUP BY (@rank ) DIV 5

结果如下:

+----+------+----------------+
| id | rank | GROUPS         |
+----+------+----------------+
|  1 |    1 | 1,3,5,7,9      |
| 13 |    7 | 11,13,15,17,19 |
| 29 |   15 | 21,23,25,27,29 |
| 31 |   16 | 31,33,35,37,39 |
| 45 |   23 | 41,43,45,47,49 |
| 51 |   26 | 51,53,55,57,59 |
| 61 |   31 | 61,63,65,67,69 |
| 77 |   39 | 71,73,75,77,79 |
| 81 |   41 | 81,83,85,87,89 |
| 93 |   47 | 91,93,95,97,99 |
+----+------+----------------+

非常感谢您的帮助,没有您的帮助我就不知道了!

+1 是为了聪明但稍微有些邪恶的解决方案。我认为这可能是在 MySQL 中实现它的最佳方式,因为 ROW_NUMBER 还没有得到支持。 - Mark Byers
我真的不知道是否还有其他方法,你的答案给了我一个很好的解决方案,然后我记得我可以添加一个相关编号的列,我听说Microsoft SQL在某些领域更强大,但我希望我已经完成了高中并学习了计算机科学,我所知道的是在互联网上学到的,例如英语(我的母语是西班牙语),我知道的是思考和找到解决方案,一堆好技巧和找到正确答案的方法,再次非常感谢你的帮助! - Rodrigo Polo
你说得对,一般来说SQL Server拥有更多的功能。例如,它确实有ROW_NUMBER函数可以在这里使用。然而,它没有GROUP_CONCAT或任何等效的函数(只能使用可怕的FOR XML方法)。因此,两种数据库都不是解决这个问题的理想选择 - 你需要在每个数据库中绕过缺失的功能。 - Mark Byers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接