Ver Mensaje Individual
  #11 (permalink)  
Antiguo 02/07/2010, 07:39
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: 14 años, 1 mes
Puntos: 2658
Respuesta: Listado encuesta

La teoría es simple, pero empecemos desde el principio:
- Las variables de usuario no tienen tipo ni declaración. Comienzan a existir desde el momento en que invocas una y dejan de existir cuando se cierra la conexión a donde se usaron.
- No se pueden compartir entre conexiones, por lo que, a pesar de existir en el servidor, son inaccesibles para otros usuarios usando otra conexión, aún cuando la conexión sea usando el mismo username y password y desde el mismo host.
- A pesar de ello, estas variables conservan el último valor ingresado durante todo el tiempo de la conexión, por lo que hay que tener mucho cuidado con usar su valor sin inicializarlo: Puede contener basura. Esto es especialmente riesgoso cuando se usan en los SP, ya que son las únicas variables que pueden existir fuera de ellos y ser usadas dentro... Las otras son locales.
- Estas variables adquieren su tipo al ser inicializadas. Hasta entonces su valor es NULL.
- Como valen NULL hasta ser inicializadas, deben serlo antes de ser usadas en una consulta. De allí que un modo sea realizar un JOIN con la inicalización de la variable:
Código MySQL:
Ver original
  1. (SELECT @a:=0)
- Existen dos formas de asignación de valor a una variable de usuario:
Código MySQL:
Ver original
  1. SET @a = 0;
  2. @a := 0;
- La primera forma se usa dentro de los SP, o bien como sentencia independiente. Es indistinto. La otra forma se denomina asignación dinámica, y es la única forma en que pueden usarse dentro de una sentencia SELECT.
- Esto es clave: La asignación dinámica opera en el mismo instante en que aparece, y cambia el valor de la variable en el momento en que está realizando la lectura. Dentro de una sentencia SELECT eso significa que la variable cambia su valor en cada registro encontrado..., y en el mismo orden en que aparezca en la sentencia.
Para darte un ejemplo:
Código MySQL:
Ver original
  1. SELECT @A, NOMBRE, APELLIDO,( @A:= @A+ 1), ( @A:= @A+ 1), ( @A:= @A+ 1)
  2. FROM tablausuarios, JOIN (SELECT @A:=0) T;
Cuando esta sentencia comienza a ejecutarse, se inicializa la variable; cuando pone el primer campo de la primera línea, el valor sigue siendo cero. Pero cuando pone la tercera su valor pasa a ser 1, cuando pone la cuarta columna, pasa a ser 2 y luego 3 al terminar de poner el registro.
Pero atención: cuando pone el primer campo del segundo registro encontrado, su valor es 3, porque fue el último valor adquirido en el último campo del registro anterior...
¿Se entiende la progresión?

En la consulta que te pasé, la lógica dice así:
- La tabla viene ordenada por comuna, pero desordenada por personas.
- En cada registro verifica el valor de la comuna y si es igual , le suma uno al contador, si es diferente le asigna 1. Como la primera vez viene con cero (0), hace la asignación, con lo que el contador sigue en 1.
- A continuación se verifica el valor de la comuna. Si son iguales, solamente representa el valor y si no, lo cambia. Para el siguiente registro, el valor de comuna habrá cambiado, por lo que el acumulador vuelve a 1, y después la comuna continúa valiendo lo mismo...

¿Se comprende la lógica de todo esto?

Cuando las llegas a dominar a estas variables, puedes hacer cosas realmente creativas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)