82 votes

générer une séquence entière dans MySQL

Je dois faire une jointure avec une table / result-set / tout ce qui a les entiers n à m inclus. Existe-t-il un moyen trivial d’obtenir cela sans simplement construire la table?

(En passant, comment s'appellerait ce type de construction, une "méta requête"?)

mn est lié à quelque chose de raisonnable (<1000)

122voto

David Poor Points 581

J'ai trouvé cette solution sur le web

SELECT @row := @row + 1 as row, t.*
FROM some_table t, (SELECT @row := 0) r

Requête simple, rapide, et fait exactement ce que je voulais: je peux maintenant le "numéro" les "sélections" trouvé à partir d'une requête complexe avec des numéros uniques commençant à 1 et en incrémentant une fois pour chaque ligne dans le résultat.

Je pense que cela fonctionnera aussi pour le problème ci-dessus: ajuster le départ, la valeur de @row et ajouter une clause limit pour mettre le maximum.

BTW: je pense que le "r" n'est pas vraiment nécessaire.

ddsp

38voto

Unreason Points 8703

Ce qui suit retournera 1..10000 et n'est pas si lent

 SELECT @row := @row + 1 as row FROM 
(select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 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 3 union all select 4 union all select 5 union all select 6 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 3 union all select 4 union all select 5 union all select 6 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 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t4, 
(SELECT @row:=0)
 

11voto

Eugene Yokota Points 43213

Il n'y a pas de générateur de numéro de séquence ( CREATE SEQUENCE ) dans MySQL. La chose la plus proche est AUTO_INCREMENT , ce qui peut vous aider à construire la table.

5voto

John Nilsson Points 4650

Vous pouvez essayer quelque chose comme ça:

 select *
from
(
  SELECT @rn:=@rn+1 as id from (select @rn:=2)t, `order` limit 4
) n inner join `order` using (id)
 

2voto

ysth Points 54757

Quelle est la taille m?

Vous pourriez faire quelque chose comme:

 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;
 

où auto_increment est défini sur n et la clause where est comparée à m et le nombre de répétitions des deux tables est au moins égal à ceil (log (m-n + 1) / log (2)).

(Les deux tables non temporaires peuvent être omises en remplaçant deux par (select null foo union all select null) dans la séquence de création d'une table temporaire.)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X