Obtener una columna con el número de fila en 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:
[CODE]
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)
[/CODE]

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:

[CODE]
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)
[/CODE]

Vía: The road to using MySQL

Tags: , , , , , , ,


  • Walter

    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

    Reply

  • robinson rafael lapeira montenegro

    la mejor respuesta por su puesto que fue esta a lo que yo estaba buscando muy bueno

    Reply

  • Camilo

    Excelente tu aporte.
    Muchas gracias.

    Reply

  • JL Cetina

    Perfecto, algo así de sencillo estaba buscando, muchas gracias

    Reply

  • Santiago

    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);

    Reply

  • Aristides López de León

    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

    Reply

  • Ileana

    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.

    Reply

  • Junka

    Bueno el aporte lo esta buscando y no encontraba otra solucion mas facil

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.