Obtener una columna con el número de fila en MySQL
Autor: Luciano | Categoría: Bases de Datos, MySQL
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:
mysql> SELECT id,name FROM City ORDER BY name ASC LIMIT 15;
+------+----------------------+
| 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:
mysql> SELECT @rownum:=@rownum+1 'row number',name
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)
Vía: The road to using MySQL
7 Respuestas para "Obtener una columna con el número de fila en MySQL"
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
la mejor respuesta por su puesto que fue esta a lo que yo estaba buscando muy bueno
Excelente tu aporte.
Muchas gracias.
Perfecto, algo así de sencillo estaba buscando, muchas gracias
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);
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
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.
Comentarios: