23 mayo 2008

Número de fila en MySQL

Luego de buscar información en la red y de haber navegado a través de varios foros me encontré con la que me pareció la solución más bonita para obtener el número de fila en el conjunto de datos recuperado con la instrucción SELECT.

Habiendo visto varias soluciones de tipo "crear tabla temporal con un campo autonumérico" o "utilizar LEFT OUTER JOIN" me encontré con una variante de lo que a continuación expongo:

SET @i = 0;
SELECT
(@i := @i + 1) linea, nombre FROM personas ORDER BY nombre;

Estas dos instrucciones nos devolverán para todos los registros de la tabla [personas], la línea y el nombre. Si no inicializamos la variable @i (primera instrucción) el valor quedará disponible por lo que al volver a ejecutar una consulta que utilice dicha variable notaremos el resultado.

Si lo que deseamos es enumerar los registros dentro de un grupo, por ejemplo, si agruparamos a las personas por la columna [id_tipo], quedaría de la siguiente forma .

SET @tipo = 0;
SELECT id_tipo, IF(@tipo = id_tipo,@tipo := @tipo + 1,@tipo := 1) linea , nombre
FROM personas
ORDER BY id_tipo, nombre;

Una alternativa para no tener que fijar el valor de la variable en una instrucción por separado sería, agregar la subconsulta

(SELECT @tipo := 0) dummy

como aparece a continuación:

SELECT id_tipo, IF(@tipo = id_tipo,@tipo := @tipo + 1,@tipo := 1) linea , nombre
FROM personas, (SELECT @tipo := 0) dummy
ORDER BY id_tipo, nombre;