Como posso fazer um gerador de linha no MySQL?
Pergunta
Existe uma maneira de gerar um número arbitrário de linhas que podem ser usados ??em uma associação semelhante à sintaxe Oracle:
SELECT LEVEL FROM DUAL CONNECT BY LEVEL<=10
Solução
Odeio dizer isso, mas MySQL
é a única RDBMS
dos quatro grandes que não tem esse recurso.
Em Oracle
:
SELECT *
FROM dual
CONNECT BY
level < n
Em MS SQL
(até linhas 100
):
WITH hier(row) AS
(
SELECT 1
UNION ALL
SELECT row + 1
FROM hier
WHERE row < n
)
SELECT *
FROM hier
ou usando dica até 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
Em PostgreSQL
:
SELECT *
FROM generate_series (1, n)
Em MySQL
, nada.
Outras dicas
No MySQL, é meu entender que você pode obter mais de uma linha com um SELECT com nenhuma tabela (ou DUAL).
Portanto, para obter várias linhas, você do precisa de uma mesa real ou temporário com pelo menos o número necessário de linhas.
No entanto, você não precisa para construir uma tabela temporária como você pode usar ANY tabela que tem, pelo menos, o número de linhas necessárias existente. Então, se você tem uma tabela com pelo menos o número necessário de linhas, use:
SELECT @curRow := @curRow + 1 AS row_number
FROM sometable
JOIN (SELECT @curRow := 0) r
WHERE @curRow<100;
Basta substituir "sometable" com o nome de qualquer tabela de vocês com pelo menos o número necessário de linhas.
PS: O "r" é uma tabela de "Alias": Eu poderia ter usado "AS r". Qualquer subconsulta em um FROM ou uma cláusula de junção cria uma "tabela derivada", que, como acontece com todas as tabelas, deve ter um nome ou alias. (Veja MySql manual:. 13.2.9.8 Subqueries na cláusula FROM)
Uma vez que este é atualmente um dos primeiros resultados no Google para "gerador de linha mysql", vou acrescentar uma atualização.
Se o seu sabor do MySQL passa a ser MariaDB, eles têm esta característica. É o chamado "Armazenamento Sequence motor" e é usado como este :
select * from seq_1_to_10;
Com os resultados:
+-----+
| seq |
+-----+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10 |
+-----+
10 rows in set (0.00 sec)
Até a versão 10.0 foi um plugin separado que precisava ser explicitamente instalado, mas a partir de 10,0 em diante ele é construído em. Divirta-se!
I teve uma tabela com uma coluna (c5
) que continha um número x, I necessário uma expressão SQL que repetida a mesma linha x número de vezes.
A minha mesa A continha:
c1 c2 c3 c4 c5
16 1 2 16 3
16 1 2 17 2
16 1 2 18 1
E eu precisava:
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
Eu resolvi que, com a expressão:
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;
Se eu estou entendendo você, você quer uma lista de números consequtive?
Apenas fazer a lista:
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
... etc, até que você tem, digamos, 1024.
update artificial_range set idn = id - 1 ;
- agora você tem uma série olhando para 1 (id) e uma série começando em 0
Agora, junte-se a ele, ou juntar-se às transformações de que:
create view days_this_century as
select date_add('2000-01-01', interval a.idn day) as cdate
from artificial_range;
Não sei se isso ajuda, mas pode numerar as linhas de cada instrução SELECT com algo. como:
SET @NUM = 0;
SELECIONAR @NUM: = @ NUM + 1 RowNumber, * FROM ...
E mais tarde se juntar a eles em um presente. Em grandes bases de dados isto pode ser muito lento.
Para gerar 10 linhas:
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
Você pode gerar 100 linhas fazendo uma junção com outras 10 linhas:
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
E então 1000 linhas com outra juntar-se, ...