代码之家  ›  专栏  ›  技术社区  ›  Ian Gregory

mysql中的串联范围描述

  •  2
  • Ian Gregory  · 技术社区  · 14 年前

    我在表格中的数据如下:

    +---+----+
    | 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的方法(特别是MySQL5.1?)

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

    2 回复  |  直到 14 年前
        1
  •  3
  •   OMG Ponies    14 年前

    用途:

         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
    

    其思想是,如果为组顺序值分配一个值,那么可以使用最小值/最大值来获得适当的值。IE:

    a  |  b | blah
    ---------------
    a  |  1 | 1
    a  |  2 | 1
    a  |  4 | 2
    a  |  5 | 2
    
        2
  •  1
  •   Community rcollyer    7 年前

    我还发现马丁·史密斯对另一个问题的回答很有帮助:

    printing restaurant opening hours from a database table in human readable format using php