Ver Mensaje Individual
  #5 (permalink)  
Antiguo 03/09/2009, 08:07
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: nuevo COUNT para cada registro de un select

La consulta para lograr ese encadenamiento es un poquitin compleja, pero nada más que por necesitar cierta claridad en la redacción.
Aquí la estoy haciendo en tres niveles como para que se entienda cómo se obtiene.
El punto esencial es que esta consulta genera una tabla en memoria, de modo que mi sugerencia es crear con ella una tabla temporal, la cual podrás usar luego para insertar este código dentro de la tabla, o simplemente para representarlo. Tu verás.
La idea es:
Código sql:
Ver original
  1. SELECT alumno_id, CONCAT(CARACTER, LPAD(CONTARSI,3,'0'))
  2. FROM (SELECT
  3.     alumno_id,
  4.     IF(@LETTER = LETRA , @CONTAR := @CONTAR+1, @CONTAR := 1) CONTARSI,
  5.     (@LETTER := LETRA) CARACTER
  6.   FROM
  7.     (SELECT
  8.       alumno_id,
  9.       LEFT(alumno_id,1) LETRA,
  10.       @LETTER := '',
  11.       @CONTAR:=0
  12.     FROM alumno
  13.     ORDER BY apellido_alumno)
  14.   T1)
  15. T2;

La función LPAD se usa en este caso para convertir un entero rellenando los espacios a la izquierda con ceros hasta la longitud deseada.

La idea es que en cada registro se verifica que la letra que se separó inicialmente (es más simple separar la inicial en el inicio de las consultas) sea igual a la que se está recibiendo en la variable de usuario. Si no lo es, el contador se pone en 1 y si lo es se suma uno. LUEGO se procede a recargar la variable con el valor de letra de ese registro.

En el uso de las variables de usuario hay que recordar que cada invocación de asignación se ejecuta en el punto donde la variable aparece, y no al terminar la sentencia que la usa.
Para que sea claro, esto se ejecuta una sola vez, pero la variable, al terminar la sentencia vale diferente en cada segmento:
Código SQL:
Ver original
  1. SELECT @A:=1, @A:=@A+4, @A:=@A+3, @A:=@A-2, @A:=@A+9
  2. FROM (SELECT @A:=0) a
El resultado sería una tabla con estos valores:
Cita:
1, 5, 8, 6, 15
¿Se entiende cómo funciona?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 03/09/2009 a las 08:13