Ver Mensaje Individual
  #12 (permalink)  
Antiguo 07/12/2009, 18:44
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: posición relativa de un registro en la base de datos

Cita:
no lo llego a entender perfectamente
Las subconsultas son como cualquier operación con paréntesis: Tienes que resolverla desde adentro hacia afuera.
Ten en cuenta que cada capa de una subconsulta lo que hace es generar una tabla en memoria (tabla derivada) que contiene los resultados de ese nivel. Como es una tabla, y las tablas se identifican por nombres, toda subconsulta debe terminar con un alias. Es obligatorio.
Así, lo primero que se hace en este caso es decirle a MySQL que devuelva todos los registros ordenados por puntaje descendiente, pero que además incluya una columna que se usará para una variable de usuario. Cualquier cosa que agregues al listados del select, y que cumpla los requisitos para devolver un dato (valor y nombre), se convierte en una columna.

En la segunda subconsulta, lo único que se hace es volver a tomar los datos ya devueltos, pero hacer que la variable trabaje como un contador.

El secreto: Los valores de las variables de usuario cambian en el mismo punto donde se hace una asignación. Así, cuando lee el primer registro toma el valor 1. Pero cuando llega a leer el segundo registro, ya tiene el valor 1, así que incrementa a 2, y así sucesivamente.

Si quieres ver cómo cambian los valores de una variable con cada aparición, ejecuta esto:
Código SQL:
Ver original
  1. SELECT @A:=1, @A, @A:=2, @A, @A:=3, @A, @A:=4, @A
  2. FROM (SELECT @A:=0) TABLA;
Verás que con cada asignación, aún en el mismo registro, la variable cambia de valor.

Finalmente, en el SELECT exterior estás recibiendo la tabla, ordenada como la primera, pero con los registros numerados de uno en uno. Allí solamente tienes que elegir cuál es el que quieres. Por eso el valor de ID se usa solamente en ese (caso contrario, la numeración daría siempre 1).
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)