如何使用mysql获取连续数字?

如何使用mysql获取连续数字?,mysql,Mysql,我想检索连续的数字及其计数,例如在我的数据库中,我有类似的输入 1,2,3,4,5,9,10,12,14,15,16,51,81 我预期的产出 Numbers counts 1-5 5 9-10 2 12-16 4 51 1 81 1 如果有人知道,请分享解决方案。免责声明:这是为了好玩。使用您选择的实际编程语言可能更容易 这并不

我想检索连续的数字及其计数,例如在我的数据库中,我有类似的输入

1,2,3,4,5,9,10,12,14,15,16,51,81
我预期的产出

Numbers         counts
  1-5              5
  9-10             2
 12-16             4
   51              1
   81              1
如果有人知道,请分享解决方案。免责声明:这是为了好玩。使用您选择的实际编程语言可能更容易

这并不像看上去那么简单,你必须使用它

样本数据:

CREATE TABLE t
    (`id` int)
;

INSERT INTO t
    (`id`)
VALUES
    (1),
    (2),
    (3),
    (4),
    (5),
    (9),
    (10),
    (12),
    (14),
    (15),
    (16),
    (51),
    (81)
;
查询:

SELECT CONCAT_WS('-', MIN(id), IF(MAX(id) = MIN(ID), NULL, MAX(id))), COUNT(*)
FROM (
SELECT 
id
, @group_number := IF(@prev != id - 1, @group_number + 1, @group_number) AS gn
, @prev := id
FROM 
t,
(SELECT @group_number := 0, @prev := NULL) var_init_subquery
ORDER BY id
) sq
GROUP BY gn
结果:

| CONCAT_WS('-', MIN(id), IF(MAX(id) = MIN(ID), NULL, MAX(id))) | COUNT(*) |
|---------------------------------------------------------------|----------|
|                                                           1-5 |        5 |
|                                                          9-10 |        2 |
|                                                            12 |        1 |
|                                                         14-16 |        3 |
|                                                            51 |        1 |
|                                                            81 |        1 |
  • 现场观看它的工作
  • 免责声明:这是为了好玩。使用您选择的实际编程语言可能更容易

    这并不像看上去那么简单,你必须使用它

    样本数据:

    CREATE TABLE t
        (`id` int)
    ;
    
    INSERT INTO t
        (`id`)
    VALUES
        (1),
        (2),
        (3),
        (4),
        (5),
        (9),
        (10),
        (12),
        (14),
        (15),
        (16),
        (51),
        (81)
    ;
    
    查询:

    SELECT CONCAT_WS('-', MIN(id), IF(MAX(id) = MIN(ID), NULL, MAX(id))), COUNT(*)
    FROM (
    SELECT 
    id
    , @group_number := IF(@prev != id - 1, @group_number + 1, @group_number) AS gn
    , @prev := id
    FROM 
    t,
    (SELECT @group_number := 0, @prev := NULL) var_init_subquery
    ORDER BY id
    ) sq
    GROUP BY gn
    
    结果:

    | CONCAT_WS('-', MIN(id), IF(MAX(id) = MIN(ID), NULL, MAX(id))) | COUNT(*) |
    |---------------------------------------------------------------|----------|
    |                                                           1-5 |        5 |
    |                                                          9-10 |        2 |
    |                                                            12 |        1 |
    |                                                         14-16 |        3 |
    |                                                            51 |        1 |
    |                                                            81 |        1 |
    
    • 现场观看它的工作
    虽然在阅读了免责声明之后,我可能会这么做。现在只需要一个紧急的选择


    虽然在阅读了免责声明之后,我可能会这么做。现在只需要一个快速选项

    我的表中有一列类似studentId,该列中的值不是完全连续的,有些断点在那里(断点表示缺少一些值,例如1,2,3,4,5,8,9,10,15,23)。所以我想计算表中有多少个连续数据,没有起始点和结束点FWIW,这让我觉得在SQL查询中很难做到,但在后端代码中,比如说PHP,这很容易做到。@CatoMinor有趣的是,我认为,这是另一种方式…在SQL中很容易做到,在PHP中做起来很乏味…@Martin I did:-我的表中有一列类似studentId,在该列中,值不是完全连续的,有些断点在那里(断点表示缺少一些值,例如1,2,3,4,5,8,9,10,15,23)。所以我想计算表中有多少个连续数据,没有起始点和结束点FWIW,这让我觉得在SQL查询中很难做到,但在后端代码中,比如说PHP,这很容易做到。@CatoMinor有趣的是,我认为,这是另一种方式…在SQL中很容易做到,用PHP做起来很无聊…@Martin I做了:-DHi,这很好,但是有没有办法让它与众不同?嗨,这很好,但是有没有办法让它与众不同?