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

Consulta MySql - Ultimos 3 registros que cumplan una condición

Estas en el tema de Consulta MySql - Ultimos 3 registros que cumplan una condición en el foro de Mysql en Foros del Web. Buenas, tengo una consulta que no estoy seguro que se pueda hacer como tengo organizada la base de datos. También es posible de tanta prueba ...
  #1 (permalink)  
Antiguo 06/05/2014, 09:02
 
Fecha de Ingreso: noviembre-2002
Mensajes: 50
Antigüedad: 21 años, 5 meses
Puntos: 0
Consulta MySql - Ultimos 3 registros que cumplan una condición

Buenas, tengo una consulta que no estoy seguro que se pueda hacer como tengo organizada la base de datos. También es posible de tanta prueba me haya liado y no sepa resolverla.
Tengo las siguientes tablas:
Alumnos
------------
id
nombre
apellidos
...
...

Asistencia
------------
id
alumno_id
dia_de_clase
asiste (contiene un valor true o false)

La cuestión es que debo obtener los ultimos 3 registros de cada alumno y comprobar si asiste = 0. O sea, saber que alumnos no han asistido a las 3 ultimas clases.

¿Tenéis alguna idea? A las malas podría quedarme con los 3 ultimos registros de cada alumno y luego por medio de código comprobar esos 3 registros si son con asiste = 0.

Cualquier idea me vale.
Gracias
  #2 (permalink)  
Antiguo 06/05/2014, 09:35
 
Fecha de Ingreso: abril-2012
Mensajes: 30
Antigüedad: 12 años
Puntos: 0
Respuesta: Consulta MySql - Ultimos 3 registros que cumplan una condición

Hola ffresno, el problema es medio parecido al que plantee ayer! Prueba con la solución posteada!

http://www.forosdelweb.com/f86/obtener-n-registros-detalles-cada-registro-maestro-1098615/


Veamos si algo así te sirve:


Código SQL:
Ver original
  1. SELECT IF(alumno_id = @cm, @contador:=@contador+1, @contador:=1 AND @cm:=alumno_id) contador,  asiste , alumno_id
  2.  
  3. FROM (SELECT @cm:=1, @contador:=0) r, Asistencia
  4. WHERE asiste = 0
  5.  
  6. GROUP BY contador, alumno_id
  7. HAVING contador <= 3
  8.  
  9. ORDER BY alumno_id, contador DESC

Contanos como te fue!
Saludos
  #3 (permalink)  
Antiguo 06/05/2014, 10:34
 
Fecha de Ingreso: noviembre-2002
Mensajes: 50
Antigüedad: 21 años, 5 meses
Puntos: 0
Respuesta: Consulta MySql - Ultimos 3 registros que cumplan una condición

Hola, muchas gracias por la respuesta pero no me funciona. Sólo me da un registro que cumpla con la condición y contador siempre se queda a 1

Código MySQL:
Ver original
  1. SELECT IF(alumno_id = @cm, @contador:=@contador+1, @contador:=1 AND @cm:=alumno_id) contador,  a.asiste , a.alumno_id
  2. FROM (SELECT @cm:=1, @contador:=0) r, pasarlistaalumnos a
  3. WHERE a.asiste = 0
  4. GROUP BY contador, alumno_id
  5. HAVING contador <= 3
  6. ORDER BY alumno_id, contador DESC


La verdad es que algo entiendo de la consulta pero no me queda muy claro. Si pudiera quedarme solo con los ultimos 3 registros de cada alumno (si tener en cuenta el campo asiste) podría agrupar sumando el campo asiste de los 3 registros y si es mayor de 0 me valdría como un alumno que falta las 3 ultimas veces consecutivas.

Última edición por gnzsoloyo; 06/05/2014 a las 10:40
  #4 (permalink)  
Antiguo 06/05/2014, 10:51
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Consulta MySql - Ultimos 3 registros que cumplan una condición

No he probado nada, pero intenta con esto

Código MySQL:
Ver original
  1. SELECT al.nombre, al.apellidos, al.id, a.dia_de_clase, COUNT(a.asiste) asistencias
  2.  FROM Asistencia a INNER JOIN
  3.    (SELECT distinct dia_de_clase FROM Asistencia ORDER BY dia_de_clase DESC LIMIT 3)t1
  4.         ON a.dia_de_clase = t1.dia_de_clase
  5.  INNER JOIN alumnos al ON a.alumno_id = al.id WHERE a.asiste = 1 GROUP BY al.id HAVING asistencias < 3
  #5 (permalink)  
Antiguo 07/05/2014, 01:45
 
Fecha de Ingreso: noviembre-2002
Mensajes: 50
Antigüedad: 21 años, 5 meses
Puntos: 0
Respuesta: Consulta MySql - Ultimos 3 registros que cumplan una condición

Código MySQL:
Ver original
  1. SELECT al.nombre, al.apellidos, al.id, a.dia_de_clase, COUNT(a.asiste) asistencias
  2.  FROM Asistencia a INNER JOIN
  3.    (SELECT distinct dia_de_clase FROM Asistencia ORDER BY dia_de_clase DESC LIMIT 3)t1
  4.         ON a.dia_de_clase = t1.dia_de_clase
  5.  INNER JOIN alumnos al ON a.alumno_id = al.id WHERE a.asiste = 1 GROUP BY al.id HAVING asistencias < 3

De momento no me funciona pero es mejor que lo que tenía yo. Te resumo lo que entiendo por si se me escapa algo
Código MySQL:
Ver original
  1. (SELECT distinct dia_de_clase FROM Asistencia ORDER BY dia_de_clase DESC LIMIT 3)t1 //elegimos los 3 ultimos registros en la tabla de asistencias

//Para cada registro de los 3 ultimos que hemos seleccionado los relacionamos con la tabla de asistencias
Código MySQL:
Ver original
  1. SELECT al.nombre, al.apellidos, al.id, a.dia_de_clase, COUNT(a.asiste) asistencias
  2.  FROM Asistencia a INNER JOIN
  3.    (SELECT distinct dia_de_clase FROM Asistencia ORDER BY dia_de_clase DESC LIMIT 3)t1
  4.         ON a.dia_de_clase = t1.dia_de_clase

Ahora esa union tendríamos que comprobar que son todos asiste = 0, o sea, que no ha asistido a clase los ultimos 3 registros, por lo que creo que esa parte no estaría bien

//Hacemos el join con alumnos agrupando por el id de alumno
Código MySQL:
Ver original
  1. INNER JOIN alumnos al ON a.alumno_id = al.id WHERE a.asiste = 1 GROUP BY al.id HAVING asistencias < 3

No enteindo pq se comprueba con asiste = 1 ¿No debería comprobar que todos los asiste suma 0? O sea, que asistencias es = 0?

Gracias por vuestra ayuda y tiempo

Última edición por gnzsoloyo; 07/05/2014 a las 04:17
  #6 (permalink)  
Antiguo 07/05/2014, 03:21
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Consulta MySql - Ultimos 3 registros que cumplan una condición

Creo que estais complicando la solución.

Cita:
...saber que alumnos no han asistido a las 3 ultimas clases.
Código MySQL:
Ver original
  1. SELECT alumno_id
  2. FROM Asistencia
  3. AND asiste=False;

Eso nos da los alumnos que tienen alguna falta de asistencia en los tres ultimos dias.


Código MySQL:
Ver original
  1. SELECT alumno_id, count(*) Faltas
  2. FROM Asistencia
  3. AND asiste=False
  4. GROUP BY alumno_id;


Con un LEFT JOIN con Alumnos podriamos obtener la lista de alumnos completa con el numero de faltas en los ultimos tres dias.

Código MySQL:
Ver original
  1. SELECT Sbc.alumno_id, A.nombre, A.apellidos, IFNULL(Sbc.Faltas,0) Faltas
  2. FROM Alumnos A LEFT JOIN
  3.         (SELECT alumno_id, count(*) Faltas
  4.              FROM Asistencia
  5.              WHERE dia_de_clase>=DATE_SUB(CURRENT_DATE(),INTERVAL 3 DAY)
  6.              AND asiste=False
  7.              GROUP BY alumno_id) Sbc
  8.        ON A.id=Sbc.alumno_id;

La tabla Asistencia seria mejorable, eliminando el campo "asiste" y guardando solo los alumnos que asiten, reduciendo así la información guardada. La solución al tema anterior seria otra claro.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 07/05/2014 a las 03:33
  #7 (permalink)  
Antiguo 07/05/2014, 08:34
 
Fecha de Ingreso: noviembre-2002
Mensajes: 50
Antigüedad: 21 años, 5 meses
Puntos: 0
Respuesta: Consulta MySql - Ultimos 3 registros que cumplan una condición

Perfecto!! Muchas gracias. No era exactamente como decías pero muy parecido.

El campo asiste = 0 me servía porque me es mucho más fácil gestionar cuando asiste o no independientemente si ocupa más o menos espacio en bd.

Gracias

Etiquetas: condición, registro, registros, 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 16:22.