Poesía Binaria

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....