Это gaps-and-islands проблема, а вот еще один способ ее решения, который также использует переменные:
SELECT
MIN(a) AS series_start,
MAX(a) AS series_end,
MAX(a) - MIN(a) + 1 AS series_count
FROM (
SELECT
a,
@r := @r + 1 AS r
FROM
yourtable,
(SELECT @r := 0) AS x
ORDER BY
a
) s
GROUP BY
a - r
ORDER BY
a - r
;
Вот как оно работает.
подзапрос присваивает номера строк для строк таблицы и возвращает эту строку набора:
a r
-- --
1 1
2 2
3 3
5 4
6 5
7 6
9 7
10 8
11 9
12 10
В этом случае r
столбец, в котором хранятся номера строк, происходит в соответствии с id
столбец в вашей выборке данных, но я предполагаю, что в общем случае столбец id
может иметь пробелы, и по этой причине его здесь нельзя использовать.
Основные группы запроса результаты по разнице между r
и a
: для последовательных значений, она всегда будет такой же:
a r a - r
-- -- -----
1 1 0
2 2 0
3 3 0
5 4 1
6 5 1
7 6 1
9 7 2
10 8 2
11 9 2
12 10 2
и что позволяет группировать такие строки вместе. Все, что остается в этой точке, чтобы получить воз- можно, максимум и рассчитывать, что дает этот вывод:
series_start series_end series_count
------------ ---------- ------------
1 3 3
5 7 3
9 12 4
SQL-Fiddle демонстрацию этого запроса, для которых я заимствовал @ схему sgeddes'S, можно найти here.
UPDATE
Как числовые переменные не могут быть использованы (в соответствии с комментариями), можно назначить номера строк с помощью треугольного автообъединения, но это будет гораздо менее эффективно, чем при использовании переменного. Во всяком случае, вот модифицированная версия, изменения в предыдущем запросе быть выделены жирным шрифтом:
SELECT
MIN(a) AS series_start,
MAX(a) AS series_end,
MAX(a) - MIN(a) + 1 AS series_count
FROM (
SELECT
data.a,
COUNT(*) AS r
FROM
yourtable AS data
INNER JOIN
yourtable AS tally
ON
data.id >= tally.id
GROUP BY
data.a
) s
GROUP BY
a - r
ORDER BY
a - r
;
Сам подход остается неизменным: подзапрос возвращает ранжированный набор строк, который затем обрабатывается так же, как ранее.
Демо-версия SQL Fiddle для модифицированного запроса доступна here.
Вопросы, требующие кода, должны демонстрировать минимальное понимание решаемой проблемы. Включите попытки решения, почему они не работают и ожидаемые результаты. – Kermit
Она нуждается в несколько соединений, но не подзапросов ;-) не – Strawberry
ВЫБРАТЬ аа начало , MIN (CA) конец , MIN (CA) - AA + 1 Diff ОТ my_table ЛЕВЫЙ РЕГИСТРИРУЙТЕСЬ my_table б ВКЛ аа = ба + 1 ЛЕВЫЙ РЕГИСТРИРУЙТЕСЬ my_table гр О са> = аа ЛЕВЫЙ РЕГИСТРИРУЙТЕСЬ my_table д на дА = c.a + 1 Где ба IS NULL и кальциевые IS NOT NULL И да IS NULL ГРУППА АА; – Strawberry