DISCLAIMER: This is for the fun of it. It may be easier to use an actual programming language of your choice.
This is not as easy as it first looks, you have to use user-defined variables.
Sample data:
CREATE TABLE t
(`id` int)
;
INSERT INTO t
(`id`)
VALUES
(1),
(2),
(3),
(4),
(5),
(9),
(10),
(12),
(14),
(15),
(16),
(51),
(81)
;
Query:
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
Result:
| 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 |