Más de una vez tuve la necesidad de en una consulta enumerar las filas de la misma, por medio de una columna calculada auto incremental ¿se entiende cual era me requerimiento?
Explicándolo de nuevo, mi necesidad era de contar con una nueva columna que sea un número auto incremental y que represente el número de fila. Según el artículo original esto se puede hacer en Oracle a través de la variable rownum (no doy fe de ello pues no conozco).
Bien, en esta publicación disponemos de la solución.
Veamos un ejemplo: tengo la siguiente tabla con nombres de ciudades ordenadas alfabéticamente:
+——+———————-+
| id | name |
+——+———————-+
| 670 | A Coruña (La Coruña) |
| 3097 | Aachen |
| 3318 | Aalborg |
| 2760 | Aba |
| 1404 | Abadan |
| 395 | Abaetetuba |
| 3683 | Abakan |
| 1849 | Abbotsford |
| 2747 | Abeokuta |
| 478 | Aberdeen |
| 3191 | Abha |
| 2812 | Abidjan |
| 1703 | Abiko |
| 3989 | Abilene |
| 1309 | Abohar |
+——+———————-+
15 rows in set (0.00 sec)
El código a continuación utiliza una variable @rownum que inicializa como argumento del FROM y se evita de declarar la variable previamente con SET @rownum: = 0;
El resultado es el que veremos abajo, sencillo y sorprendente:
FROM City C , (SELECT @rownum:=0) R
ORDER BY name ASC LIMIT 15;
+————+———————-+
| row number | name |
+————+———————-+
| 1 | A Coruña (La Coruña) |
| 2 | Aachen |
| 3 | Aalborg |
| 4 | Aba |
| 5 | Abadan |
| 6 | Abaetetuba |
| 7 | Abakan |
| 8 | Abbotsford |
| 9 | Abeokuta |
| 10 | Aberdeen |
| 11 | Abha |
| 12 | Abidjan |
| 13 | Abiko |
| 14 | Abilene |
| 15 | Abohar |
+————+———————-+
15 rows in set (0.01 sec)




Walter
agosto 23, 2009
Lucian, buenas tardes…
Muy bueno estaba buscando solucionar ese problema desde el server MySQL y no desde el cliente, y has dado en el clavo tio…., sencillo simple y practico, esto luego lo creo en una view y problema solucionado, yo habia llegado solo hasta usar el SET, pero no pense ni imagine meterlo en el FROM, simplemente…
Gracias por tu aporte
robinson rafael lapeira montenegro
octubre 6, 2010
la mejor respuesta por su puesto que fue esta a lo que yo estaba buscando muy bueno
Camilo
noviembre 4, 2010
Excelente tu aporte.
Muchas gracias.
JL Cetina
enero 6, 2011
Perfecto, algo así de sencillo estaba buscando, muchas gracias
Santiago
agosto 1, 2011
Genial, pero no funciona en todas las ocasiones. Si haces una totalización de datos agrupados y ordenas en base al resultado totalizado no funciona.
Prueba algo así, y te dará el número de fila de la primera ocurrencia de cada nombre
mysql> SELECT @rownum:=@rownum+1 ‘row number’,nombre, sum(dinero)
FROM cuentas C , (SELECT @rownum:=0) R
GROUP BY nombre
ORDER BY sum(dinero);
Aristides López de León
octubre 15, 2011
Efectivamente, si haces una totalizacion de datos agrupados y ordenados en base al resultado totalizado no funciona….
Pero
si haces a manera de proxi, un view, o un select de la consulta totalizada, y despues sobre eso haces el truco, si funciona!!!
Me explico sobre tu ejemplo
Consulta normal
mysql> SELECT nombre, sum(dinero) as tdinero
FROM cuentas C
GROUP BY nombre
ORDER BY tdinero ;
//supongamos que lo de arriba lo metes en un view, es la manera mas facil de comprender, aunque se puede hacer sin tenerlo en un view
entonces
digamos que el view se llama, VIEW1
harias….
mysql> SELECT nombre, sum(dinero)
FROM cuentas C
GROUP BY nombre
ORDER BY sum(dinero);
select @rownum:=@rownum+1 ‘row number’, nombre, tdinero from VIEW1, (SELECT @rownum:=0) R order by tdinero
y voila!!!!
ya lo tienes
Ileana
noviembre 15, 2011
Me parece muy buena la idea, pero lo probe y no me funciona =(, no sé si tenga que ver con la versión del sql.