Генерируйте целочисленную последовательность в MySQL

Я должен сделать соединение с table/result-set/whatever, который имеет целые числа n кому: m включительно. Существует ли тривиальный способ получить это, просто не создавая таблицу?

(BTW, чем тот тип конструкции назвали бы, "запрос Meta"?)

m-n ограничен к чему-то разумному (<1000-е)

55
задан simhumileco 18 July 2019 в 08:09
поделиться

7 ответов

Нет никакого генератора порядкового номера (, СОЗДАЮТ ПОСЛЕДОВАТЕЛЬНОСТЬ ) в MySQL. Самая близкая вещь AUTO_INCREMENT, который может помочь Вам создать таблицу.

7
ответ дан Eugene Yokota 26 November 2019 в 17:38
поделиться

При использовании Oracle 'конвейерные функции' были бы способом пойти. К сожалению, MySQL не имеет такой конструкции.

В зависимости от масштаб чисел Вы хотите наборы, я вижу два простых способа пойти: Вы любой заполняет временную таблицу только с числами, в которых Вы нуждаетесь (возможно использование таблиц памяти, заполненных хранимой процедурой) для единого запроса или, впереди, Вы создаете большую таблицу, которая рассчитывает от 1 до 1 000 000, и выберите ограниченные области его.

0
ответ дан Sean McSomething 26 November 2019 в 17:38
поделиться

Вы, кажется, в состоянии создать довольно большие наборы с:

select 9 union all select 10 union all select 11 union all select 12 union all select 13 ...

я получил переполнение стека синтаксического анализатора в 5300, на 5.0.51a.

3
ответ дан ysth 26 November 2019 в 17:38
поделиться

Предупреждение: при вставке чисел одна строка за один раз Вы закончите тем, что выполнили команды N, где N является количеством строк, необходимо вставить.

можно уделить внимание, это к O (зарегистрируйте N) при помощи временной таблицы (см. ниже для вставки чисел от 10 000 до 10 699):

mysql> CREATE TABLE `tmp_keys` (`k` INTEGER UNSIGNED, PRIMARY KEY (`k`));
Query OK, 0 rows affected (0.11 sec)

mysql> INSERT INTO `tmp_keys` VALUES (0),(1),(2),(3),(4),(5),(6),(7);
Query OK, 8 rows affected (0.03 sec)
Records: 8  Duplicates: 0  Warnings: 0

mysql> INSERT INTO `tmp_keys` SELECT k+8 from `tmp_keys`;
Query OK, 8 rows affected (0.02 sec)
Records: 8  Duplicates: 0  Warnings: 0

mysql> INSERT INTO `tmp_keys` SELECT k+16 from `tmp_keys`;
Query OK, 16 rows affected (0.03 sec)
Records: 16  Duplicates: 0  Warnings: 0

mysql> INSERT INTO `tmp_keys` SELECT k+32 from `tmp_keys`;
Query OK, 32 rows affected (0.03 sec)
Records: 32  Duplicates: 0  Warnings: 0

mysql> INSERT INTO `tmp_keys` SELECT k+64 from `tmp_keys`;
Query OK, 64 rows affected (0.03 sec)
Records: 64  Duplicates: 0  Warnings: 0

mysql> INSERT INTO `tmp_keys` SELECT k+128 from `tmp_keys`;
Query OK, 128 rows affected (0.05 sec)
Records: 128  Duplicates: 0  Warnings: 0

mysql> INSERT INTO `tmp_keys` SELECT k+256 from `tmp_keys`;
Query OK, 256 rows affected (0.03 sec)
Records: 256  Duplicates: 0  Warnings: 0

mysql> INSERT INTO `tmp_keys` SELECT k+512 from `tmp_keys`;
Query OK, 512 rows affected (0.11 sec)
Records: 512  Duplicates: 0  Warnings: 0

mysql> INSERT INTO inttable SELECT k+10000 FROM `tmp_keys` WHERE k<700;
Query OK, 700 rows affected (0.16 sec)
Records: 700  Duplicates: 0  Warnings: 0

редактирование: к вашему сведению к сожалению, это не будет работать с истинным временная таблица с MySQL 5.0 , поскольку это не может вставить в себя (Вы могли возвратиться назад и вперед между двумя временными таблицами).

редактирование: Вы могли использовать механизм устройства хранения данных ПАМЯТИ для предотвращения этого от того, чтобы на самом деле быть дренажом на "реальной" базе данных. Интересно, разработал ли кто-то механизм виртуальной памяти "ЧИСЕЛ" для инстанцирования виртуальной памяти для создания последовательностей, таких как это. (увы, непортативный внешний MySQL)

1
ответ дан Jason S 26 November 2019 в 17:38
поделиться

Вы могли попробовать что-то вроде этого:

SELECT @rn:=@rn+1 as n
FROM (select @rn:=2)t, `order` rows_1, `order` rows_2 --, rows_n as needed...
LIMIT 4

, Где order просто en пример некоторой таблицы с довольно большим набором строк.

Редактирование: исходный ответ был неправильным, и любой кредит должен перейти к David Poor, который обеспечил рабочий пример того же понятия

5
ответ дан John Nilsson 26 November 2019 в 17:38
поделиться

Насколько большой m?

Вы могли сделать что-то как:

create table two select null foo union all select null;
create temporary table seq ( foo int primary key auto_increment ) auto_increment=9 select a.foo from two a, two b, two c, two d;
select * from seq where foo <= 23;

, где auto_increment установлен на n и, где пункт выдерживает сравнение с m и количеством раз, две таблицы повторяются, по крайней мере, перекрывают (журнал (m-n+1) / журнал (2)).

(Невременные две таблицы могли быть опущены путем замены два с (избранное пустое объединение нечто весь избранный пустой указатель) в составлять временной таблице seq.)

2
ответ дан ysth 26 November 2019 в 17:38
поделиться

Я нашел это решение в Интернете

SET @row := 0;
SELECT @row := @row + 1 as row, t.*
FROM some_table t, (SELECT @row := 0) r

Единый запрос, быстро и делает именно то, что я хотел: теперь я могу «пронумеровать» «выборки», найденные в сложном запросе, с помощью уникальных номеров начиная с 1 и увеличиваясь один раз для каждой строки результата.

Я думаю, что это также сработает для проблемы, указанной выше: измените начальное начальное значение для @row и добавьте условие ограничения, чтобы установить максимум.

Кстати: я думаю, что буква «r» на самом деле не нужна.

ddsp

98
ответ дан 26 November 2019 в 17:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: