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

[SOLUCIONADO] Consulta con LEFT JOIN no muestra datos

Estas en el tema de Consulta con LEFT JOIN no muestra datos en el foro de Mysql en Foros del Web. Hola comunidad como siempre cuando no puedo mas acudo a ustedes para ayudarme Tengo mis 2 tablas ALUMNO y COBRO para las cuales necesito saber ...
  #1 (permalink)  
Antiguo 26/05/2015, 13:43
Avatar de emilio_viguri  
Fecha de Ingreso: junio-2011
Ubicación: Mexico
Mensajes: 116
Antigüedad: 12 años, 10 meses
Puntos: 3
Pregunta Consulta con LEFT JOIN no muestra datos

Hola comunidad como siempre cuando no puedo mas acudo a ustedes para ayudarme

Tengo mis 2 tablas ALUMNO y COBRO para las cuales necesito saber que cobro es el próximo, cuales faltan... para lo cual hago lo siguiente.

Mis tablas
Código MySQL:
Ver original
  1. CREATE TABLE cobro (
  2.   idcobro INT(11) NOT NULL AUTO_INCREMENT,
  3.   idalumno INT(11) NOT NULL,
  4.   tipo TINYINT(1) UNSIGNED NULL,
  5.   monto FLOAT(10,2) NULL,
  6.   comentario VARCHAR(200) NULL,
  7.   fechadeposito DATE NULL,
  8.   fechavencimiento DATE NULL,
  9.   fecharegistro DATETIME NULL,
  10.   PRIMARY KEY(idcobro),
  11.   INDEX cobro_FKIndex1(idalumno)
  12. );
  13.  
  14. CREATE TABLE alumno (
  15.   idalumno INT(11) NOT NULL AUTO_INCREMENT,
  16.   nombre VARCHAR(300) NULL,
  17.   nivelescolar TINYINT(1) UNSIGNED NULL,
  18.   activo TINYINT(1) UNSIGNED NULL DEFAULT 1,
  19.   inscripcion FLOAT(10,2) NULL,
  20.   mensualidad FLOAT(10,2) NULL,
  21.   otrospagos VARCHAR(255) NULL,
  22.   PRIMARY KEY(idalumno)
  23. );

Mis consulta así funciona pero si no tengo ningún registro de pago en la tabla pago no me muestra nada necesitaré que me ponga los idalumno que no tengan ningún registro en la tabla cobros.

Código MySQL:
Ver original
  1. SELECT alumno.idalumno, alumno.nombre, alumno.nivelescolar, alumno.sexo, alumno.inscripcion, alumno.mensualidad, alumno.otrospagos
  2. FROM alumno
  3. LEFT JOIN cobro ON cobro.idalumno = alumno.idalumno
  4. WHERE alumno.activo = 1
  5. AND DATEDIFF(fechavencimiento, curdate() ) <= 5 # :asco: SI QUITO ESTO ME MUESTRA LO QUE NECESITO PERO NO CUENTA LOS DÍAS
  6. ORDER BY DATEDIFF(fechavencimiento, curdate() )

Lo que no se como hacer es decirle a MySQL que...

Muéstrame todos los alumnos activos que su fecha de pago este próxima a vencer o que no tengas ninguno cobro realizado (que no tenga ningún registro en la tabla cobro)

Última edición por gnzsoloyo; 26/05/2015 a las 14:01
  #2 (permalink)  
Antiguo 26/05/2015, 14:03
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Consulta con LEFT JOIN no muestra datos

Hola emilio_viguri:

Tienes un problema con la condición, pues al ponerla tal como lo estás haciendo ESTÁS OBLIGANDO A QUE EXISTAN COBROS PARA EL ALUMNO, en otras palabras, estás echando a perder el LEFT JOIN.

Código:
Lo que no se como hacer es decirle a MySQL que...

Muéstrame todos los alumnos activos que su fecha de pago este próxima a vencer o que no tengas ninguno cobro realizado (que no tenga ningún registro en la tabla cobro)
Lo haces así:

Código:
...
WHERE 
   alumno.activo = 1 AND 
   (DATEDIFF(fechavencimiento, curdate() ) <= 5 or
   fechavencimiento IS NULL)
...
Recierda que cuando haces un LEFT JOIN, aquellos campos de la tabla en el LEFT que no EXISTAN, son rellenados con un null...

haz la prueba y nos comentas.

Saludos
Leo
  #3 (permalink)  
Antiguo 26/05/2015, 14:33
Avatar de emilio_viguri  
Fecha de Ingreso: junio-2011
Ubicación: Mexico
Mensajes: 116
Antigüedad: 12 años, 10 meses
Puntos: 3
De acuerdo Respuesta: Consulta con LEFT JOIN no muestra datos

Si funciona no se a un que hisiste pero a si me funciono gracais

Código SQL:
Ver original
  1. SELECT alumno.idalumno, alumno.nombre, alumno.nivelescolar, alumno.sexo, alumno.inscripcion, alumno.mensualidad, alumno.otrospagos
  2. FROM alumno
  3. LEFT JOIN cobro
  4. ON cobro.idalumno = alumno.idalumno
  5. WHERE alumno.activo = 1
  6. AND (DATEDIFF(cobro.fechavencimiento, curdate() ) <= 5
  7. OR cobro.fechavencimiento IS NULL)
  8. ORDER BY DATEDIFF(cobro.fechavencimiento, curdate() )

Voy a echarle una nueva leída a los JOIN ... gracias ...

Me falta entender bien eso que comentas de cual es la tabla que llena con NULL la alumno o la cobro ?
  #4 (permalink)  
Antiguo 26/05/2015, 14:39
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Consulta con LEFT JOIN no muestra datos

en tu caso seria la cobro, un left join te trae la informacion que esta en la tabla A con los datos que corresponden en la tabla B, los datos que no corresponden los rellena con NULL ejem:

Código MySQL:
Ver original
  1. tabla A
  2. id  valor
  3. 1   A
  4. 2   B
  5. 3   C
  6.  
  7. tabla B
  8. id  valor
  9. 1   A
  10. 2    B
  11.  
  12. select * from tablaA
  13. left join tablaB on (tablaa.id=tablab.id)
  14.  
  15. Resultado:
  16. id valor  id  valor
  17. 1   A        1   A
  18. 2   B         2  B
  19. 3   C        NULL  NULL
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 27/05/2015, 15:14
Avatar de emilio_viguri  
Fecha de Ingreso: junio-2011
Ubicación: Mexico
Mensajes: 116
Antigüedad: 12 años, 10 meses
Puntos: 3
Respuesta: Consulta con LEFT JOIN no muestra datos

Otra ves tengo problemas con la consulta me podrían ayudar en las mismas tablas lo que dice esta consulta es:

Mostrarme todos los alumnos que ESTÉN ACTIVOS, con una fecha de pago vencido entre 27 y 37 días O que no tengan pago algun pago...

pero lo que no me sale es indicarle que ignore los pagos de tipo 1 y solo muestre los de tipo 2 eso es lo que no puedo encontrar como se hace en la tabla de pago!

Código SQL:
Ver original
  1. SELECT alumno.idalumno, alumno.nombre, alumno.nivelescolar, alumno.sexo, pago.tipo FROM alumno LEFT JOIN pago ON pago.idalumno = alumno.idalumno
  2. WHERE alumno.activo = 1
  3. AND ( DATEDIFF(CURDATE(), pago.fechavencimiento ) >= 27
  4. AND DATEDIFF(CURDATE(), pago.fechavencimiento ) <= 37
  5. OR pago.fechadeposito IS NULL )
  6. AND (pago.tipo = 2 OR pago.tipo IS NULL)
  7. ORDER BY alumno.nombre

Modifique cobro por pago

Código SQL:
Ver original
  1. CREATE TABLE pago (
  2.   idpago INT(11) NOT NULL AUTO_INCREMENT,
  3.   idalumno INT(11) NOT NULL,
  4.   tipo TINYINT(1) UNSIGNED NULL,
  5.   monto FLOAT(10,2) NULL,
  6.   comentario VARCHAR(200) NULL,
  7.   fechadeposito DATE NULL,
  8.   fechavencimiento DATE NULL,
  9.   fecharegistro DATETIME NULL,
  10.   PRIMARY KEY(idpago),
  11.   INDEX cobro_FKIndex1(idalumno)
  12. );
  #6 (permalink)  
Antiguo 27/05/2015, 15:24
Avatar de emilio_viguri  
Fecha de Ingreso: junio-2011
Ubicación: Mexico
Mensajes: 116
Antigüedad: 12 años, 10 meses
Puntos: 3
Respuesta: Consulta con LEFT JOIN no muestra datos

Creo que ya quedo le pues que un OR en lugar de AND y quedo ...

Código SQL:
Ver original
  1. SELECT alumno.idalumno, alumno.nombre, alumno.nivelescolar, alumno.sexo, pago.tipo
  2. FROM alumno LEFT JOIN pago ON pago.idalumno = alumno.idalumno
  3. WHERE alumno.activo = 1
  4. AND (pago.tipo = 1 OR pago.tipo IS NULL)
  5.  
  6. OR ( DATEDIFF(CURDATE(), pago.fechavencimiento ) >= 27
  7. AND DATEDIFF(CURDATE(), pago.fechavencimiento ) <= 37
  8. OR pago.fechadeposito IS NULL )
  9.  
  10. ORDER BY alumno.nombre

Pero como le hago para que si tengo ya un pago tipo 1 ya no lo muestre ?

Última edición por emilio_viguri; 27/05/2015 a las 15:33 Razón: falta a un
  #7 (permalink)  
Antiguo 28/05/2015, 07:36
Avatar de emilio_viguri  
Fecha de Ingreso: junio-2011
Ubicación: Mexico
Mensajes: 116
Antigüedad: 12 años, 10 meses
Puntos: 3
Pregunta Respuesta: Consulta con LEFT JOIN no muestra datos

Sigo intentado y no e logrado nada de lo que necesito

quería que me arrojara los campos que no tengan pagos en este mes pero no lo e logrado ya que me mustra registros duplicados o no me los uestra o me muestra los ya pagados asi que por lo pronto yo creo que lo voy a destripar con programacion por que con consultas no me salio ...

Código MySQL:
Ver original
  1. SELECT alumno.idalumno, alumno.nombre, alumno.nivelescolar, alumno.sexo, pago.tipo
  2. FROM alumno LEFT JOIN pago ON pago.idalumno = alumno.idalumno
  3. WHERE alumno.activo = 1
  4. AND EXISTS ( SELECT DISTINCT(Idalumno), MONTH(CURDATE()) FROM pago WHERE tipo <>2  AND MONTH(fecharegistro) = MONTH(CURDATE()) )
  5. OR ( DATEDIFF(CURDATE(), pago.fechavencimiento ) >= 27
  6. AND DATEDIFF(CURDATE(), pago.fechavencimiento ) <= 37
  7. OR pago.fechadeposito IS NULL )
  8. ORDER BY alumno.nombre

Etiquetas: fecha, join, left, muestra, registro, select, sql, tabla
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 21:16.