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

Obtener registros de una tabla que no estén en otra

Estas en el tema de Obtener registros de una tabla que no estén en otra en el foro de Mysql en Foros del Web. Tengo la tabla miembros y la tabla asistencia como lo muestra la figura: La tabla asistencia registra la fecha de asistencia de cada miembro. Necesito ...
  #1 (permalink)  
Antiguo 29/06/2019, 23:32
Avatar de laureano59  
Fecha de Ingreso: febrero-2005
Mensajes: 395
Antigüedad: 19 años, 9 meses
Puntos: 1
Pregunta Obtener registros de una tabla que no estén en otra

Tengo la tabla miembros y la tabla asistencia como lo muestra la figura:



La tabla asistencia registra la fecha de asistencia de cada miembro.

Necesito hacer una consulta de los miembros que no aparecen en la asistencia debido a que no asistieron ese día.
Si lo hago de esta manera funciona y me saca todos los miembros que no aparecen en la tabla asistencia:

Código MySQL:
Ver original
  1. SELECT `miembros`.`identificacion_mie`, `miembros`.`nombre_mie`, `asistencia`.`fecha_asi`, `asistencia`.`identificacion_mie`
  2. FROM `miembros`
  3.     LEFT JOIN `asistencia` ON `asistencia`.`identificacion_mie` = `miembros`.`identificacion_mie`
  4. WHERE `asistencia`.`identificacion_mie` is null

Ahora lo que yo necesito es sacar los miembros que no asistieron en una determinada fecha y es ahí donde tengo problemas ya que al poner un rango de fecha no me salen datos.

Alguna idea de cómo saber que miembros no asistieron en una determinada fecha?

Gracias por su valiosa ayuda, cualquier idea o sugerencia es bien recibida pues ya llevo un buen rato intentando hacerlo y no me sale.
__________________
http://www.weblaum.com
Laureano Melo Medina
:arriba:
  #2 (permalink)  
Antiguo 02/07/2019, 13:54
Avatar de laureano59  
Fecha de Ingreso: febrero-2005
Mensajes: 395
Antigüedad: 19 años, 9 meses
Puntos: 1
Respuesta: Obtener registros de una tabla que no estén en otra

Debido a que no veo ninguna respuesta voy a explicar un poco lo que necesito hacer:
Debo sacar dos reportes uno con todos los miembros que asisten a una determinada reunión, y el otro reporte con todos los miembros que faltaron a esa reunión, la tabla asistencia me registra los miembros que asistieron, pero debido a que los miembros que no asisten no están obligados a reportarse no se como lograr obtener los que no asistieron a partir de los que si asistieron...

Alguna idea por favor ...
__________________
http://www.weblaum.com
Laureano Melo Medina
:arriba:
  #3 (permalink)  
Antiguo 02/07/2019, 14:48
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Obtener registros de una tabla que no estén en otra

Código SQL:
Ver original
  1. CREATE TABLE #usuarios(
  2. id INT,
  3. nombre nvarchar(20)
  4. )
  5.  
  6. CREATE TABLE #asistencia(
  7. id INT,
  8. id_usuario INT,
  9. fecha datetime
  10. )
  11.  
  12. INSERT INTO #usuarios VALUES (1,'yo')
  13. INSERT INTO #usuarios VALUES (2,'tu')
  14. INSERT INTO #usuarios VALUES (3,'el')
  15.  
  16. INSERT INTO #asistencia VALUES (1,1,getdate())
  17. INSERT INTO #asistencia VALUES (2,2,getdate())
  18. INSERT INTO #asistencia VALUES (3,1,dateadd(dd,-1,getdate()))
  19. INSERT INTO #asistencia VALUES (4,3,dateadd(dd,-2,getdate()))
  20.  
  21.  
  22. SELECT
  23. CASE
  24. WHEN isnull(t2.id_usuario,'')='' THEN t1.id END AS faltante,
  25. CASE WHEN isnull(t2.fecha,'')='' THEN t1.fecha END AS fecha_faltante
  26.  FROM
  27. (
  28. SELECT * FROM (SELECT DISTINCT id FROM #usuarios) AS t1
  29. CROSS JOIN (SELECT DISTINCT CONVERT(nvarchar(20),fecha,10) AS fecha FROM #asistencia) AS t2
  30. ) AS t1
  31. LEFT JOIN #asistencia AS t2 ON (t1.id=t2.id_usuario AND t1.fecha=CONVERT(nvarchar(20),t2.fecha,10))
  32. WHERE t2.id_usuario IS NULL AND t2.fecha IS NULL

Resultado:

faltante fecha_faltante
1 06-30-19
2 06-30-19
2 07-01-19
3 07-01-19
3 07-02-19

El codigo esta en sql server pero creo puedes adaptarlo, que hice, primero cree una tabla con las fechas y los usuarios, un usuario para cada fecha,

Código SQL:
Ver original
  1. SELECT * FROM (SELECT DISTINCT id FROM #usuarios) AS t1
  2. CROSS JOIN (SELECT DISTINCT CONVERT(nvarchar(20),fecha,10) AS fecha FROM #asistencia)

esto para poder saber cuando asistio y cuando no, esto es necesario para este tipo de consultas porque no tienes nada contra que comparar. Aqui hice un cross join para que por cada usuario le generara un registro de fecha, con estos datos ya solo compare contra la tabla de asistencias para saber si ese dia asistio o no.

Filtrado por fecha:
Código SQL:
Ver original
  1. SELECT
  2. CASE
  3. WHEN isnull(t2.id_usuario,'')='' THEN t1.id END AS faltante,
  4. CASE WHEN isnull(t2.fecha,'')='' THEN t1.fecha END AS fecha_faltante
  5.  FROM
  6. (
  7. SELECT * FROM (SELECT DISTINCT id FROM #usuarios) AS t1
  8. CROSS JOIN (SELECT DISTINCT CONVERT(nvarchar(20),fecha,10) AS fecha FROM #asistencia) AS t2
  9. ) AS t1
  10. LEFT JOIN #asistencia AS t2 ON (t1.id=t2.id_usuario AND t1.fecha=CONVERT(nvarchar(20),t2.fecha,10))
  11. WHERE (t2.id_usuario IS NULL AND t2.fecha IS NULL) AND t1.fecha='06-30-19'
Resultado:

faltante fecha_faltante
1 06-30-19
2 06-30-19
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #4 (permalink)  
Antiguo 02/07/2019, 14:49
Avatar de ArturoGallegos
Moderador
 
Fecha de Ingreso: febrero-2008
Ubicación: Morelia, México
Mensajes: 6.774
Antigüedad: 16 años, 9 meses
Puntos: 1146
Respuesta: Obtener registros de una tabla que no estén en otra

Aqui te van un par de ideas al aire

No las probe pero como ideas te sirven para armar tu propio codigo

Código MySQL:
Ver original
  1. select * from miembros t0
  2. left join asistencias t1 on t1.miembro_id = t0.id
  3. where t1.id is null
  4.  
  5. select * from miembros t0 where not exist(select id from asistencias t1 where t1.miembro_id = t0.id)

Etiquetas: sql
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 11:20.