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

Ayuda con subselect

Estas en el tema de Ayuda con subselect en el foro de Mysql en Foros del Web. Hola Estoy haciendo una consulta en MySQL de esta manera: SELECT COUNT( r.idReservacion ) AS numeroVendido, (SELECT nombreAgenciaO FROM `vac_operadores_agencia` WHERE idOperador=oa.idOperador) AS NombreAgencia FROM ...
  #1 (permalink)  
Antiguo 11/08/2010, 09:16
Avatar de darkangel_java  
Fecha de Ingreso: abril-2010
Mensajes: 11
Antigüedad: 14 años
Puntos: 0
Ayuda con subselect

Hola

Estoy haciendo una consulta en MySQL de esta manera:

SELECT COUNT( r.idReservacion ) AS numeroVendido, (SELECT nombreAgenciaO FROM `vac_operadores_agencia` WHERE idOperador=oa.idOperador) AS NombreAgencia FROM vac_reservaciones AS r INNER JOIN vac_detalles_reservacion AS dr ON r.idReservacion = dr.idReservacion INNER JOIN vac_operadores AS o ON r.idReservacion = o.idReservacion INNER JOIN vac_operadores_agencia AS oa ON o.idOperador = oa.idOperador WHERE dr.fechaIngreso BETWEEN '2010-08-01' AND '2010-08-31' AND dr.fechaSalida BETWEEN '2010-08-01' AND '2010-08-31' GROUP BY oa.idOperador

Me arroja este resultado:

numeroVendido NombreAgencia
_____15_____ __Agencia1___
_____12_____ __Agencia2___



El problemas es que en total tengo 5 Agencias y me gustaria que mostrara la informacion de todas aunque no hayan vendido, algo parecido a esto:

numeroVendido NombreAgencia
_____15______ __Agencia1___
_____12______ __Agencia2___
_____0_______ __Agencia3___
_____0_______ __Agencia4___
_____0_______ __Agencia5___


Que podre tener mal en la consulta???


O alguna otra forma de solucionarlo???


Gracias por su ayuda
  #2 (permalink)  
Antiguo 11/08/2010, 09:39
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, 4 meses
Puntos: 2658
Respuesta: Ayuda con subselect

Si, el problema está dado tanto por el orden de las tablas invocadas como por el hecho de usar INNER JOIN.
Por un lado, INNER JOIN exige que haya sí o sí coincidencias entre toas las tablas. No te mostrará los resultados de otra forma. Para tu caso debes usar LEFT o RIGHT JOIN. Pero en estos casos la posición de las tablas afecta el resutlado y deben ordenarse desde la que tiene todos los registros a las que sólo tiene una parte.
Esto significa que si no todas las agencias tienen tickets, entonces vac_reservaciones y vac_detalles_reservacion no deben ser las primeras tablas.
Si no hay agencias sin operadores ni operadores sin agencias, se puede usar INNER JOIN en ese caso; si no hay reservas sin detalle, elINNER JOIN también va entre estas dos tablas, pero no entre los pares.
Algo así:
Código MySQL:
Ver original
  1.   COUNT(r.idReservacion) numeroVendido,
  2.   oa.nombreAgenciaO NombreAgencia
  3.   vac_operadores o
  4.   INNER JOIN vac_operadores_agencia oa ON o.idOperador = oa.idOperador
  5.   LEFT JOIN vac_reservaciones AS r ON o.idReservacion = r.idReservacion
  6.   INNER JOIN vac_detalles_reservacion dr ON r.idReservacion = dr.idReservacion
  7.  
  8.   dr.fechaIngreso BETWEEN '2010-08-01' AND '2010-08-31' AND
  9.   dr.fechaSalida BETWEEN '2010-08-01' AND '2010-08-31'
  10. GROUP BY oa.idOperador;
__________________
¿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 11/08/2010, 10:17
Avatar de darkangel_java  
Fecha de Ingreso: abril-2010
Mensajes: 11
Antigüedad: 14 años
Puntos: 0
Respuesta: Ayuda con subselect

Primero que nada gracias por tu respuesta gnzsoloyo

Probe haciendolo de la manera en que me indicas y arroja el mismo resultado...

La verdad es que soy nuevo en el uso de MySQL y aun no comprendo del todo el uso de LEFT JOIN y RIGHT JOIN, a penas comenze con el uso de INNER JOIN y aun asi me da problemas.


Pondre la estructura de las tablas para que tengas un mejor panorama del asunto:


vac_reservaciones
_______________
idReservacion
nombre
aPaterno
aMaterno
eMail
status
fechaSolicitud
fechaRespuesta
idhotel
notificacion
idEvento

vac_detalles_reservacion
____________________
idDetalle
fechaIngreso
fechaSalida
numAdultos
numJuniors
numMenores
comentarios
idReservacion
idTipoHabitacionR
idPlanR



vac_operadores_agencia
____________________
idOperador
nombreAgenciaO


vac_operadores
_____________
idOperadorAgencia
idReservacion
idOperador



Cual crees que sea el problema?


Saludos!

Última edición por darkangel_java; 11/08/2010 a las 10:30
  #4 (permalink)  
Antiguo 11/08/2010, 12:12
Avatar de darkangel_java  
Fecha de Ingreso: abril-2010
Mensajes: 11
Antigüedad: 14 años
Puntos: 0
Respuesta: Ayuda con subselect

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Si, el problema está dado tanto por el orden de las tablas invocadas como por el hecho de usar INNER JOIN.
Por un lado, INNER JOIN exige que haya sí o sí coincidencias entre toas las tablas. No te mostrará los resultados de otra forma. Para tu caso debes usar LEFT o RIGHT JOIN. Pero en estos casos la posición de las tablas afecta el resutlado y deben ordenarse desde la que tiene todos los registros a las que sólo tiene una parte.
Esto significa que si no todas las agencias tienen tickets, entonces vac_reservaciones y vac_detalles_reservacion no deben ser las primeras tablas.
Si no hay agencias sin operadores ni operadores sin agencias, se puede usar INNER JOIN en ese caso; si no hay reservas sin detalle, elINNER JOIN también va entre estas dos tablas, pero no entre los pares.
Algo así:
Código MySQL:
Ver original
  1.   COUNT(r.idReservacion) numeroVendido,
  2.   oa.nombreAgenciaO NombreAgencia
  3.   vac_operadores o
  4.   INNER JOIN vac_operadores_agencia oa ON o.idOperador = oa.idOperador
  5.   LEFT JOIN vac_reservaciones AS r ON o.idReservacion = r.idReservacion
  6.   INNER JOIN vac_detalles_reservacion dr ON r.idReservacion = dr.idReservacion
  7.  
  8.   dr.fechaIngreso BETWEEN '2010-08-01' AND '2010-08-31' AND
  9.   dr.fechaSalida BETWEEN '2010-08-01' AND '2010-08-31'
  10. GROUP BY oa.idOperador;


Al aplicar esta sentencia me da el mismo resultado:

Código:
SELECT COUNT( r.idReservacion ) numeroVendido, oa.nombreAgenciaO NombreAgencia
FROM vac_operadores_agencia oa, vac_operadores AS o, vac_reservaciones AS r, vac_detalles_reservacion dr
WHERE dr.fechaIngreso
BETWEEN '2010-08-01'
AND '2010-08-31'
AND dr.fechaSalida
BETWEEN '2010-08-01'
AND '2010-08-31'
AND r.idReservacion = dr.idReservacion
AND r.idReservacion = o.idReservacion
AND o.idOperador = oa.idOperador
GROUP BY oa.nombreAgenciaO
ORDER BY numeroVendido DESC
Esto es sin el uso de JOINS,

que podria agregarle o modificarle para que me de el resultado que quiero?
  #5 (permalink)  
Antiguo 11/08/2010, 12:54
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, 4 meses
Puntos: 2658
Respuesta: Ayuda con subselect

El problema puede estar en otro lado.
Analicemos primero las tablas:
1) ¿Por qué VAC_OPERADORES tiene dos campos ID (idOperador y idOperadorAgencia)?
2) ¿Cómo se relacionan las agencias con las reservaciones?
Cita:
VAC_RESERVACIONES
idReservacion
nombre
aPaterno
aMaterno
eMail
status
fechaSolicitud
fechaRespuesta
idhotel
notificacion
idEvento
Cita:
VAC_OPERADORES_AGENCIA
idOperador
nombreAgenciaO
No se ven campos relacionales en esto ejemplos, pero en las condiciones del JOIN pusiste VAC_OPERADORES.idReservacion = VAC_RESERVACIONES.idReservacion
¿cómo puede el ID del operador estar relacionado con el ID de la reserva?

3) ¿Tienes diseñado el gráfico de relaciones de las tablas, el DER físico? Postealo.
__________________
¿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: subconsulta
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 19:28.