Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Consulta que devuelva casillas vacías

Estas en el tema de Consulta que devuelva casillas vacías en el foro de Mysql en Foros del Web. Hola, Tengo esta base de datos: ¿Es posible hacer una consulta que devuelva una tabla como ésta (o algo parecido)? Es decir, que para cada ...
  #1 (permalink)  
Antiguo 11/02/2011, 07:38
 
Fecha de Ingreso: febrero-2011
Mensajes: 4
Antigüedad: 13 años, 2 meses
Puntos: 0
Consulta que devuelva casillas vacías

Hola,

Tengo esta base de datos:


¿Es posible hacer una consulta que devuelva una tabla como ésta (o algo parecido)?


Es decir, que para cada conductor aparezcan todos sus vehículos, pero que no se repita en cada línea el nombre del conductor.

No sé si me estoy explicando...
  #2 (permalink)  
Antiguo 11/02/2011, 08:55
Avatar de 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: Consulta que devuelva casillas vacías

Se puede, pero es una consulta algo compleja, que requiere el manejo de variables de usuario, al menos dos, y subconsultas.
A mi entender, es más simple manejar esa representación directamente en la aplicación. Te complicarás menos la vida.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 14/02/2011, 03:03
 
Fecha de Ingreso: febrero-2011
Mensajes: 4
Antigüedad: 13 años, 2 meses
Puntos: 0
Respuesta: Consulta que devuelva casillas vacías

Gracias por contestar, gnzsoloyo,

No puedo modificar el código de la aplicación, por eso necesito que la consulta devuelva algo con ese formato.

¿La idea sería guardar cada columna en una variable de usuario y luego hacer algo como "SELECT @columna1, @columna2"?
  #4 (permalink)  
Antiguo 14/02/2011, 06:51
Avatar de 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: 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)
  #5 (permalink)  
Antiguo 14/02/2011, 09:14
 
Fecha de Ingreso: febrero-2011
Mensajes: 4
Antigüedad: 13 años, 2 meses
Puntos: 0
Respuesta: Consulta que devuelva casillas vacías

Muchísimas gracias.

Ya veo cómo es el mecanismo; está muy bien explicado. Ya lo tengo funcionando :)
  #6 (permalink)  
Antiguo 14/02/2011, 09:24
Avatar de 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: Consulta que devuelva casillas vacías

__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:21.