Нет никакого генератора порядкового номера (, СОЗДАЮТ ПОСЛЕДОВАТЕЛЬНОСТЬ ) в MySQL. Самая близкая вещь AUTO_INCREMENT
, который может помочь Вам создать таблицу.
При использовании Oracle 'конвейерные функции' были бы способом пойти. К сожалению, MySQL не имеет такой конструкции.
В зависимости от масштаб чисел Вы хотите наборы, я вижу два простых способа пойти: Вы любой заполняет временную таблицу только с числами, в которых Вы нуждаетесь (возможно использование таблиц памяти, заполненных хранимой процедурой) для единого запроса или, впереди, Вы создаете большую таблицу, которая рассчитывает от 1 до 1 000 000, и выберите ограниченные области его.
Вы, кажется, в состоянии создать довольно большие наборы с:
select 9 union all select 10 union all select 11 union all select 12 union all select 13 ...
я получил переполнение стека синтаксического анализатора в 5300, на 5.0.51a.
Предупреждение: при вставке чисел одна строка за один раз Вы закончите тем, что выполнили команды 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)
Вы могли попробовать что-то вроде этого:
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, который обеспечил рабочий пример того же понятия
Насколько большой 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.)
Я нашел это решение в Интернете
SET @row := 0;
SELECT @row := @row + 1 as row, t.*
FROM some_table t, (SELECT @row := 0) r
Единый запрос, быстро и делает именно то, что я хотел: теперь я могу «пронумеровать» «выборки», найденные в сложном запросе, с помощью уникальных номеров начиная с 1 и увеличиваясь один раз для каждой строки результата.
Я думаю, что это также сработает для проблемы, указанной выше: измените начальное начальное значение для @row
и добавьте условие ограничения, чтобы установить максимум.
Кстати: я думаю, что буква «r» на самом деле не нужна.
ddsp
Следующий код вернет 1..10000 и не такой медленный
SELECT @row := @row + 1 AS row FROM
(select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t,
(select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t2,
(select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t3,
(select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t4,
(SELECT @row:=0) numbers;