Ver Mensaje Individual
  #4 (permalink)  
Antiguo 14/02/2011, 06:51
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: 17 años, 2 meses
Puntos: 2658
Respuesta: Consulta que devuelva casillas vacías

No, es mucho más complejo, y además en MySQL no puedes guardar una columna, un registro o una tabla en una variable de usuario porque no existen los tipos de dato RECORD, COLUMN y TABLE en MySQL.
El primer problema (y ventaja) que te enfrentas es que las variables de usuario operan en tiempo d ejecución, por lo que su valor puede cambiar a medida que los diferntes campos o registros son leídos:
Código MySQL:
Ver original
  1. mysql> SET @a = 0;
  2. Query OK, 0 rows affected (0.00 sec)
  3.  
  4. mysql> SELECT @a:=1, @a, @a:=@a+3, @a, @a:=@a*25, @a, @a:=0, @a;
  5. +-------+------+----------+------+-----------+------+-------+------+
  6. | @a:=1 | @a   | @a:=@a+3 | @a   | @a:=@a*25 | @a   | @a:=0 | @a   |
  7. +-------+------+----------+------+-----------+------+-------+------+
  8. |     1 | 1    |        4 | 4    |       100 | 100  |     0 | 0    |
  9. +-------+------+----------+------+-----------+------+-------+------+
  10. 1 row in set (0.00 sec)
Como puedes apreciar, la variable va cambiando de valor conforme va siendo usada, en la misma línea. Se puede usar una variable de usuario para "recordar" cuál fue el valor anterior de un campo en un registro, y a su vez para determinar si se necesita cambiarlo. Pero como estas variables son dinámicas, deben ser cambiadas al final de la sentencia, cuando ya no afecten el resultado de las otras operaciones.
Además, ten en cuenta que el valor inicial de las variables de usuario es NULL, por lo que deben ser inicializadas antes de ser usadas, o se destruirá cualqueir dato que se les ingrese.
Pero como las variables de usuario crearán columnas en las consultas usadas, todas estas consultas deben a su vez estar contenidas en otras mayores, que sólo devuelvan lo necesario:
Código MySQL:
Ver original
  1.   conductor,
  2.   vehiculo
  3.   (SELECT
  4.     IF(conductor = @cond, '', conductor)
  5.     vehiculo,
  6.     (@cond:=conductor) result
  7.   FROM
  8.       (SELECT conductor, vehiculo, @cond:=''
  9.       FROM
  10.         conductores c
  11.         INNER JOIN conductores_vehiculos cv ON c.id = cv.idconductor
  12.         INNER JOIN vehiculos v ON cv.idconductor = v.id) T1) T2
Estoy poniendo el anidamiento exterior sólo para que devuelva dos columnas.

Nota: Agrupamientos, ordenaciones o cualquier otra condición puesta en este tipo de consultas puede requerir consultas muchísmo más complejas, con múltiples variables y condiciones de evaluación de las mismas que son un verdadero dolor de cabeza.
Nota 2: Las variables de usuario existen y son permanentes dentro de una conexión de un usuario y son invisibles para otras conexiones de otros usuarios (incluido el mismo usuario). Mueren sólo cuando la conexión se cierra y mantienen su valor mientas la conexion siga abierta, por lo cual es conveniente, si se las va a volver a usar en la misma conexión, que sean vuelas a inicalizar previamente.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)