Числовая последовательность в MySQL - PullRequest
1 голос
/ 22 марта 2010

В Python, если бы я хотел последовательность от 0 до 9 (включительно), я бы использовал xrange (0,10).Есть ли способ, которым я могу сделать это в MySQL?

Ответы [ 4 ]

2 голосов
/ 25 марта 2010

Так как xrange не существует, можно использовать отдельную таблицу, сохраненную с целым числом (как было сказано ранее), или просто создать хранимую процедуру для выполнения работы:

DROP PROCEDURE IF EXISTS xrange;
DELIMITER //
CREATE PROCEDURE xrange(x INT, y INT)
BEGIN
  DECLARE i INT DEFAULT x;
  CREATE TEMPORARY TABLE xrange_tmp (c1 INT);
  WHILE i < y DO
    INSERT INTO xrange_tmp VALUES (i);
    SET i = i + 1;
  END WHILE;
END;
//

Использование:

CALL xrange(-2,10);
SELECT c1 FROM xrange_tmp;
DROP TABLE xrange_tmp;

Выше, очевидно, будет медленнее, чем создание готовой таблицы с целыми числами. Это более гибкий, хотя.

0 голосов
/ 22 марта 2010

Попробуйте вариант таблица целых чисел . Это взято из Xaprb :

create table integers(i int unsigned not null);
insert into integers(i) values (0), (1), (2), (3), (4), (5), (6), (7), (8), (9);

select (hundreds.i * 100) + (tens.i * 10) + units.i as iii
from integers as units
    cross join integers as tens
    cross join integers as hundreds;

Если вы сделали этот последний select вид с именем, скажем, xrange999, то вы можете просто:

SELECT iii FROM xrange999 WHERE iii BETWEEN 0 AND 9

(конечно, вы можете сделать это с помощью таблицы из десяти строк integers, но я считаю, что тысяча целых чисел немного полезнее.)

0 голосов
/ 22 марта 2010

Если Python является вашим языком программирования, вы можете отобразить тот же диапазон Python, чтобы создать оператор INSERT в форме:

INSERT INTO Table (IDCol) VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9)

Не совсем то, что вы просили, а одна строка кода Python, которая будет обрабатывать любой диапазон вплоть до максимальной длины оператора MySQL.

0 голосов
/ 22 марта 2010

Вы можете использовать LAST_INSERT_ID () для имитации последовательностей в MySQL.

Если в качестве аргумента для LAST_INSERT_ID () указан expr, значение аргумента возвращается функцией и запоминается какследующее значение, которое будет возвращено функцией LAST_INSERT_ID ().Это может использоваться для имитации последовательностей:

Создайте таблицу для хранения счетчика последовательностей и инициализируйте ее:

CREATE TABLE sequence (id INT NOT NULL);
INSERT INTO sequence VALUES (0);

Используйте таблицу для генерации порядковых номеров, подобных этой:

  UPDATE sequence SET id=LAST_INSERT_ID(id+1);
  SELECT LAST_INSERT_ID();

Оператор UPDATE увеличивает счетчик последовательности и вызывает

следующий вызов LAST_INSERT_ID () для возврата обновленного значения.Оператор SELECT извлекает это значение.API-функция mysql_insert_id () C также может быть использована для получения значения.См. Раздел 21.9.3.37, «mysql_insert_id ()».

Подробнее здесь , а также некоторые обсуждения по этому вопросу здесь

...