Как мне создать генератор строк в MySQL?
Вопрос
Есть ли способ сгенерировать произвольное количество строк, которые могут быть использованы в соединении, аналогичном синтаксису Oracle:
SELECT LEVEL FROM DUAL CONNECT BY LEVEL<=10
Решение
Неприятно это говорить, но MySQL
является единственным RDBMS
из большой четверки, у которой нет этой функции.
В Oracle
:
SELECT *
FROM dual
CONNECT BY
level < n
В MS SQL
(до 100
строки):
WITH hier(row) AS
(
SELECT 1
UNION ALL
SELECT row + 1
FROM hier
WHERE row < n
)
SELECT *
FROM hier
или используя подсказку до 32768
WITH hier(row) AS
(
SELECT 1
UNION ALL
SELECT row + 1
FROM hier
WHERE row < 32768
)
SELECT *
FROM hier
OPTION (MAXRECURSION 32767) -- 32767 is the maximum value of the hint
В PostgreSQL
:
SELECT *
FROM generate_series (1, n)
В MySQL
, ничего.
Другие советы
Насколько я понимаю, в MySQL вы можете получить более одной строки с помощью SELECT без таблицы (или DUAL).
Следовательно, чтобы получить несколько строк, вы делай нужна реальная или временная таблица, по крайней мере, с требуемым количеством строк.
Однако, вам не нужно создавать временную таблицу как вы можете использовать Любой существующая таблица, в которой содержится по крайней мере необходимое количество строк.Итак, если у вас есть таблица, содержащая по крайней мере необходимое количество строк, используйте:
SELECT @curRow := @curRow + 1 AS row_number
FROM sometable
JOIN (SELECT @curRow := 0) r
WHERE @curRow<100;
Просто замените "sometable" именем любой вашей таблицы, содержащей по крайней мере требуемое количество строк.
PS:Буква "r" - это "псевдоним" таблицы.:Я мог бы использовать "КАК r".Любой подзапрос в предложении FROM или JOIN создает "производную таблицу", которая, как и все таблицы, должна иметь имя или псевдоним.(Смотрите руководство по MySQL:13.2.9.8.Подзапросы в предложении FROM)
Поскольку в настоящее время это один из первых результатов в Google для "генератора строк mysql", я добавлю обновление.
Если вашей версией MySQL является MariaDB, у них есть эта функция.Это называется "Механизм хранения последовательностей" и это используется вот так:
select * from seq_1_to_10;
С результатами:
+-----+
| seq |
+-----+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10 |
+-----+
10 rows in set (0.00 sec)
До версии 10.0 это был отдельный плагин, который требовалось устанавливать явно, но начиная с версии 10.0 он встроен.Наслаждайтесь!
У меня была таблица со столбцом (c5
), который содержал число x, мне нужно было SQL-выражение, которое повторяло бы одну и ту же строку x количество раз.
Мой стол A содержал:
c1 c2 c3 c4 c5
16 1 2 16 3
16 1 2 17 2
16 1 2 18 1
И мне нужно было:
c1 c2 c3 c4 c5 n
16 1 2 16 3 1
16 1 2 16 3 2
16 1 2 16 3 3
16 1 2 17 2 1
16 1 2 17 2 2
16 1 2 18 1 1
Я решил это с помощью выражения:
SELECT
c1, c2, c3, c4, c5, row_number AS n
FROM
(
SELECT
@curRow := @curRow + 1 AS row_number
FROM
tablea
JOIN (SELECT @curRow := 0) r
WHERE
@curRow < (
SELECT
max(field1)
FROM
tablea
)
) AS vwtable2
LEFT JOIN tablea d ON vwtable2.row_number <= tablea.field1;
Если я вас правильно понимаю, вам нужен список последовательных чисел?
Просто составьте список:
create table artificial_range (id int not null primary key auto_increment, idn int);
insert into artificial_range (idn) values (0); --first row
insert into artificial_range(idn) select idn from artificial_range; --2nd
insert into artificial_range(idn) select idn from artificial_range; -- now 4 rows
insert into artificial_range(idn) select idn from artificial_range; --8
insert into artificial_range(idn) select idn from artificial_range; --16
insert into artificial_range(idn) select idn from artificial_range; --32
insert into artificial_range(idn) select idn from artificial_range; --64
insert into artificial_range(idn) select idn from artificial_range; --128
...и т.д., пока у вас не будет, скажем, 1024.
update artificial_range set idn = id - 1 ;
-- теперь у вас есть серия, начинающаяся с 1 (id), и серия, начинающаяся с 0
Теперь присоединяйтесь к нему или присоединяйтесь к его преобразованиям:
create view days_this_century as
select date_add('2000-01-01', interval a.idn day) as cdate
from artificial_range;
Я не знаю, помогает ли это, но вы можете пронумеровать строки из каждого оператора select с помощью sth.Нравится:
УСТАНОВИТЬ @NUM = 0;
ВЫБЕРИТЕ @NUM:=@NUM+1 Номер строки, * ИЗ ...
А позже присоединяйтесь к ним в этом вопросе.В больших базах данных это может быть очень медленно.
Чтобы сгенерировать 10 строк:
SELECT a AS a 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 from dual
Вы можете сгенерировать 100 строк, объединив их еще с 10 строками:
select t2.a*10 + t1.a from
(SELECT 0 AS a 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) t1,
(SELECT 0 AS a 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
И затем 1000 строк с другим соединением, ...