Publi

Numerar los resultados de un SELECT en MYSQL

Este ejemplo puede tener muchas utilidades. Por ejemplo, que queramos generar automáticamente campos ID (sin autoincrement), tanto empezando en 1 como empezando en el número que queramos o realizar alguna operación matemática con ese número; en definitiva vamos a introducir un número incremental a cada resultado que nos devuelva.

Imaginamos que tenemos una tabla `Emails` donde tengo correos electrónicos y nombres de varios amigos. Para crear la estructura, copiar y pegar en MySQL:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
DROP SCHEMA IF EXISTS `PoesiaBinaria` ;
CREATE DATABASE IF NOT EXISTS `PoesiaBinaria` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

USE `PoesiaBinaria`;

CREATE TABLE `Emails` (
       `Email` VARCHAR(100) NOT NULL,
       `Nombre` VARCHAR(200) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

INSERT INTO `Emails` (`Nombre`, `Email`) VALUES ('Pedro', 'pedro@misamigos.com');
INSERT INTO `Emails` (`Nombre`, `Email`) VALUES ('Javier', 'javier@misamigos.com');
INSERT INTO `Emails` (`Nombre`, `Email`) VALUES ('Gaspar', 'gaspar@misamigos.com');
INSERT INTO `Emails` (`Nombre`, `Email`) VALUES ('Maria', 'maria@misamigos.com');
INSERT INTO `Emails` (`Nombre`, `Email`) VALUES ('Sandra', 'sandra@misamigos.com');
INSERT INTO `Emails` (`Nombre`, `Email`) VALUES ('Andrea', 'andrea@misamigos.com');
INSERT INTO `Emails` (`Nombre`, `Email`) VALUES ('Clara', 'clara@misamigos.com');
INSERT INTO `Emails` (`Nombre`, `Email`) VALUES ('Andres', 'andres@misamigos.com');

Ahora puedo extraer datos de dicha tabla:

1
SELECT * FROM `Emails`;

Que me devuelve:

+——–+———————-+
| Email | Nombre |
+——–+———————-+
| Pedro | pedro@misamigos.com |
| Javier | javier@misamigos.com |
| Gaspar | gaspar@misamigos.com |
| Maria | maria@misamigos.com |
| Sandra | sandra@misamigos.com |
| Andrea | andrea@misamigos.com |
| Clara | clara@misamigos.com |
| Andres | andres@misamigos.com |
+——–+———————-+
8 rows in set (0.00 sec)

Ahora bien, para numerar los resultados podemos hacer lo siguiente:

1
2
SET @numero=0;
SELECT @numero:=@numero+1 AS `posicion`, `Emails`.* FROM `Emails`;

La variable @numero la podemos inicializar al valor que queramos, será donde vamos a empezar menos 1, y el campo posición irá incrementándose a medida que vayamos obteniendo resultados. Muy importantes los «:» (dos puntos), ya qe si no el valor de @numero no se irá actualizando. Es más, si no los ponemos, estaríamos «preguntando» si @numero es igual a @numero+1 por lo que nos devolvería 0.

El resultado de el código anterior es:

+———-+——–+———————-+
| posicion | Email | Nombre |
+———-+——–+———————-+
| 1 | Pedro | pedro@misamigos.com |
| 2 | Javier | javier@misamigos.com |
| 3 | Gaspar | gaspar@misamigos.com |
| 4 | Maria | maria@misamigos.com |
| 5 | Sandra | sandra@misamigos.com |
| 6 | Andrea | andrea@misamigos.com |
| 7 | Clara | clara@misamigos.com |
| 8 | Andres | andres@misamigos.com |
+———-+——–+———————-+

Ojo, empezamos a contar en 1, pero al principio pusimos @numero=0.

Actualización 05/04/2020: Cambiado el orden de los campos al introducir información en la tabla para seguir mejor el ejemplo.

Foto: aktuell

También podría interesarte....

There are 13 comments left Ir a comentario

  1. Pingback: Bitacoras.com /

  2. Isaac /
    Usando Mozilla Firefox Mozilla Firefox 50.0 en Windows Windows 7

    En verdad es un excelente post, habia buscado como hacer la numeración en mysql y solo hasta este punto pude hacerlo gracias a tu post, gracias por compartir el conocimiento, saludos

    1. Gaspar Fernández / Post Author
      Usando Mozilla Firefox Mozilla Firefox 50.0 en Ubuntu Linux Ubuntu Linux

      ¡Muchas gracias por tu comentario! Gente como tú mantiene vivo este blog 🙂

  3. Juan /
    Usando Google Chrome Google Chrome 64.0.3282.186 en Windows Windows 7

    Excelente,Gracias por tu aporte

  4. Enrique /
    Usando Google Chrome Google Chrome 65.0.3325.181 en Windows Windows NT

    Funciona perfectamente, gracias por el aporte

    1. Gaspar Fernández / Post Author
      Usando Mozilla Firefox Mozilla Firefox 59.0 en Ubuntu Linux Ubuntu Linux

      ¡Muchas gracias por tu comentario! Me alegra mucho leerlo 🙂

  5. macias blanco /
    Usando Google Chrome Google Chrome 72.0.3626.119 en Windows Windows NT

    excelente información, pero como podria hacer para numerar los resultados en una vista.

    1. Gaspar Fernández / Post Author
      Usando Google Chrome Google Chrome 79.0.3945.79 en Ubuntu Linux Ubuntu Linux

      Hola!
      Esto debería valer también en una vista. De todas formas, mira mi comentario de más abajo que tiene un código para mantener el orden del contador, por si te vale.

  6. Lleiser /
    Usando Google Chrome Google Chrome 74.0.3729.169 en Windows Windows NT

    Excelente!!, hay un pequeño detalle, si utilizas el Order By Nombre, la enumeración se muestra desordenada

    1. VIMSoft /
      Usando Google Chrome Google Chrome 79.0.3945.130 en Windows Windows NT

      así es, y la idea es posicionar por orden requerido.
      como se podrá hacer con Order By sin que se desordene?

      1. Gaspar Fernández / Post Author
        Usando Google Chrome Google Chrome 79.0.3945.79 en Ubuntu Linux Ubuntu Linux

        Hola!
        Esto te va mostrando orden secuencial de números tal y como van llegando los resultados. Si usas Order By, los números seguirán en el mismo orden. Si por ejemplo quieres que los elementos estén numerados y luego reordenar con Order By, se puede hacer lo siguiente:

        1
        2
        SET @numero=0;
        SELECT posicion,Email,Nombre FROM (SELECT @numero:=@numero+1 AS `posicion`, `Emails`.* FROM `Emails`) AS t ORDER BY Nombre;

        Pero claro, si necesitamos mantener un orden de los números, ¿por qué no utilizamos una clave primaria ID con autoincremento al crear la tabla?

  7. migue /
    Usando Google Chrome Google Chrome 81.0.4044.138 en Windows Windows NT

    y en php como lo agrego el set
    si mi consulta es
    SET @numero=0;
    SELECT @numero:=@numero+1 AS ‘posicion’, a.*, b.NivelEducativo, b.Grado, b.Sexo, b.Entidad FROM reto_alumno_sec_n3 a inner join usuarios b on (a.userID = b.id) where (b.Grado = ‘Secundaria_1’) and (b.Entidad != ‘Q2l1ZGFkIGRlIE1leGljbw==’) group by a.id;

    $konzultaz = «SELECT @numero:=@numero+1 AS ‘posicion’, a.*, b.NivelEducativo, b.Grado, b.Sexo, b.Entidad FROM reto_alumno_sec_n3 a inner join usuarios b on (a.userID = b.id) where (b.Grado = ‘Secundaria_1’) and (b.Entidad != ‘Q2l1ZGFkIGRlIE1leGljbw==’) group by a.id order by Fecha DESC»;

  8. walter /
    Usando Google Chrome Google Chrome 84.0.4147.89 en Windows Windows NT

    Que bueno, pero me pueden decir dentro de un select aislado como hago que los registros obtenidos tengan su numeracion sin estar utilizando un programa?

Leave a Reply