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:
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:
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
Pingback: Bitacoras.com /
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
¡Muchas gracias por tu comentario! Gente como tú mantiene vivo este blog 🙂
Excelente,Gracias por tu aporte
Funciona perfectamente, gracias por el aporte
¡Muchas gracias por tu comentario! Me alegra mucho leerlo 🙂
excelente información, pero como podria hacer para numerar los resultados en una vista.
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.
Excelente!!, hay un pequeño detalle, si utilizas el Order By Nombre, la enumeración se muestra desordenada
así es, y la idea es posicionar por orden requerido.
como se podrá hacer con Order By sin que se desordene?
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:
2
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?
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»;
No se si te sirva todavía
//$conexion_db es tu conexion a base de datos
$conexion_db-> query(«SET @numero=0;»);
$query = $conexion_db->query(sprintf(«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;»);
Gracias por responder Juanhe ! 🙂 Y a ti, migue por tu comentario.
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?
Hola Walter!
Pásame tu consulta a ver qué podemos hacer. Aunque en el post tratamos un select aislado sin ningún programa aparte del cliente de MySQL.
Saludos!
Excelente aporte, a pesar de ser un post del 2016, quiero felicitarte por tu aporte. Me resolvio un problema. Eres un genio.
Muchas gracias Jesús !! Un gusto leerte.
Muchísimas gracias por este post. Me fue muy útil y es exactamente lo que estaba buscando
This is such awesome content i got to read after lot of time. Its so interesting as well as informative. I am sure everyone who read it got a lot to learn from it.Chris Evans Ghosted Leather Jacket