Como eu faço um gerador de linha no MySQL?

Existe uma maneira de gerar um número arbitrário de linhas que podem ser usadas em um JOIN semelhante à syntax do Oracle:

SELECT LEVEL FROM DUAL CONNECT BY LEVEL<=10 

Odeio dizer isso, mas o MySQL é o único RDBMS dos quatro grandes que não tem esse recurso.

No Oracle :

 SELECT * FROM dual CONNECT BY level < n 

No MS SQL (até 100 linhas):

 WITH hier(row) AS ( SELECT 1 UNION ALL SELECT row + 1 FROM hier WHERE row < n ) SELECT * FROM hier 

ou usando a sugestão 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 

No PostgreSQL :

 SELECT * FROM generate_series (1, n) 

No MySQL , nada.

No MySql, é meu entender que você pode obter mais de uma linha com um SELECT sem tabela (ou DUAL).

Portanto, para obter várias linhas, você precisa de uma tabela real ou temporária com pelo menos o número necessário de linhas.

No entanto, você não precisa criar uma tabela temporária, pois pode usar QUALQUER tabela existente que tenha pelo menos o número de linhas necessárias. Portanto, se você tiver 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; 

Apenas substitua "sometable" pelo nome de qualquer tabela com pelo menos o número necessário de linhas.

PS: O "r" é uma tabela "alias": eu poderia ter usado "AS r". Qualquer subconsulta em uma cláusula FROM ou JOIN cria uma "tabela derivada" que, como em todas as tabelas, deve ter um nome ou um alias. (Ver manual do MySql: 13.2.9.8. Subconsultas na cláusula FROM)

Você já considerou um LEFT OUTER JOIN?

Não sei se isso ajuda, mas você pode numerar as linhas de cada instrução select com sth. gostar:

SET @ núm = 0;

SELECIONAR @NUM: = @ NUM + 1 rowNumber, * FROM …

E depois junte-se a eles neste. Em grandes bancos de dados, isso pode ser muito lento.

Se eu estou entendendo você, você quer uma lista de números consequentes?

Basta 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ê tenha, 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 junte-se a transformações dele:

  create view days_this_century as select date_add('2000-01-01', interval a.idn day) as cdate from artificial_range; 

Eu tinha uma tabela com uma coluna ( c5 ) que continha um número x, eu precisava de uma expressão SQL que repetisse a mesma linha x números de vezes.

Minha tabela 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 isso 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; 

Como este é atualmente um dos primeiros resultados no Google para “mysql row generator”, adicionarei uma atualização.

Se o seu sabor do MySQL é o MariaDB, eles têm esse recurso. É chamado de “mecanismo de armazenamento de sequência” e é usado assim:

 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 era um plugin separado que precisava ser explicitamente instalado, mas a partir de 10.0 ele é embutido. Aproveite!