sql - MySQL 中的串联范围描述

标签 sql mysql

我的表中的数据如下所示:

+---+----+
| a |  b |
+---+----+
| a |  1 |
| a |  2 |
| a |  4 |
| a |  5 |
| b |  1 |
| b |  3 |
| b |  5 |
| c |  5 |
| c |  4 |
| c |  3 |
| c |  2 |
| c |  1 |
+---+----+

我想生成一个 SQL 查询来输出如下数据:

+---+-----------+
| a |  1-2, 4-5 |
| b |  1,3,5    |
| c |  1-5      |
+---+-----------+

有没有办法纯粹用 SQL(特别是 MySQL 5.1?)来做到这一点

我得到的最接近的是select a, concat(min(b), "-", max(b)) from test group by a;,但这没有考虑范围内的差距。

最佳答案

用途:

     SELECT a, GROUP_CONCAT(x.island)
         FROM (SELECT y.a,
                               CASE
                                  WHEN MIN(y.b) = MAX(y.b) THEN
                                    CAST(MIN(y.b) AS VARCHAR(10))
                                  ELSE
                                    CONCAT(MIN(y.b), '-', MAX(y.b))
                               END AS island
                      FROM (SELECT t.a, t.b,
                                            CASE
                                                WHEN @prev_b = t.b -1 THEN
                                                    @group_rank
                                                ELSE
                                                  @group_rank := @group_rank + 1
                                            END AS blah,
                                            @prev_b := t.b
                                  FROM TABLE t
                                  JOIN (SELECT @group_rank := 1, @prev_b := 0) r
                           ORDER BY t.a, t.b) y
               GROUP BY y.a, y.blah) x  
GROUP BY a

这个想法是,如果您为组序列值分配一个值,那么您可以使用 MIN/MAX 来获取适当的值。 IE:

a  |  b | blah
---------------
a  |  1 | 1
a  |  2 | 1
a  |  4 | 2
a  |  5 | 2

关于sql - MySQL 中的串联范围描述,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3269939/

相关文章:

MySQL查询根据动态数据获取列

java - SQLJet 表插入参数

php - MySQL将字段结果乘以另一个字段的编号

java - Spring Boot API 标准多次返回

java - 如何确保 INSERT INTO 不会在 mySQL 数据库上添加相同的值

mysql - 如何在不枚举列名的情况下选择mysql中的特定列

mysql - 如何获取两个不同表的两列,其中 id = id 和 id= 9?

c# - 为什么数据库查询只会在应用程序中变慢?

mysql - 上传数据库时出现此错误 #1054 - '10' 中的未知列 'field list'

mysql - Laravel whereBetween 不起作用。表明?