Tengo una consulta que me esta dando la lata . Lo primero es que no sacaba los resultados (unas estadisticas) de forma totalmente real. Ya si lo hace bien, pero tarda 2 minutos y pico en sacar el resultado. Me han hablado de procedimientos almacenados, pero nose si con eso ganara velocidad, no se como funcionan, las vistas servirian para algo???.....
Tambien se me ha ocurrido que en lugar de que cada vez que se solicite esa consulta saque los datos actuales, a tiempo real, saque datos que ya han sido volcados a una pagina html. Es decir que MySQL un par de veces al dia actualice los datos en una pagina y asi cuando accedan a la consulta, el resultado sera instantaneo, aunque no sea a tiempo real, que les da igual.
Os pongo la consulta. Acepto todo tipo de sugerencias y opiniones al respecto.
Muchas gracias de antemano.
Código:
SELECT SQL_CACHE curso, titulo, SUM((SELECT CASE WHEN (examenes_aprobados=cantidad_examenes) THEN 1 ELSE 0 END)) AS aprobados, SUM((SELECT CASE WHEN (examenes_aprobados<>cantidad_examenes) THEN 1 ELSE 0 END)) AS suspensos, COUNT(usuario) AS total FROM (SELECT tabla_estado_alumnos.usuario AS usuario, tabla_estado_alumnos.num_test_aprobados_por_curso AS examenes_aprobados, tabla_estado_alumnos.curso AS curso, tabla_examenes_curso.numero_examenes AS cantidad_examenes, tabla_estado_alumnos.test as titulo FROM (SELECT puntuaciones.usr_id as usuario, SUM((SELECT CASE WHEN (puntuaciones.puntuacion >= cursos.cur_porcentaje_aprobacion) THEN 1 ELSE 0 END)) as num_test_aprobados_por_curso, puntuaciones.cur_id as curso, puntuaciones.cur_titulo as test FROM cursos, (SELECT SQL_CACHE resultado.ale_fecha AS Fecha, cursos.cur_id, usuarios.usr_id, cursos.cur_titulo, COUNT(resultado.ale_id) AS Preguntas, COUNT(correctas.evr_id) AS Correctas, (100.0 / COUNT(resultado.ale_id) )* COUNT(correctas.evr_id) AS Puntuacion, usuarios.usp_id FROM alumnos_evaluaciones AS resultado INNER JOIN usuarios ON (usuarios.usr_id = resultado.usr_id) INNER JOIN evaluacion_respuestas AS todas ON (todas.evr_id = resultado.evr_id) INNER JOIN evaluacion_preguntas AS p ON (todas.evp_id = p.evp_id) INNER JOIN items ON (items.itm_id = p.itm_id) INNER JOIN cursos ON (cursos.cur_id = items.cur_id AND cursos.cur_fecha_alta <= NOW() AND ((cursos.cur_fecha_baja IS NULL) OR (cursos.cur_fecha_baja >= NOW() ))) LEFT JOIN evaluacion_respuestas AS correctas ON ( correctas.evr_id = resultado.evr_id AND correctas.evr_correcta = 1 ) where resultado.ale_fecha IN (select MAX(ale_fecha) from alumnos_evaluaciones al where al.usr_id = usuarios.usr_id AND al.cur_id = cursos.cur_id) GROUP BY 1,2) AS puntuaciones, (SELECT lista_items_alumno.usr_id AS id_usuario, lista_items_curso.id_curso AS id_curso FROM (SELECT COUNT(itm_id) AS num_items, cursos.cur_titulo AS titulo, cursos.cur_id AS id_curso FROM items, cursos WHERE (items.cur_id = cursos.cur_id) AND (items.tip_id='evaluacion') GROUP BY cursos.cur_id) AS lista_items_curso, (SELECT items.cur_id, COUNT(alumnos_progreso.itm_id) AS num_items_alumno, alumnos_progreso.usr_id, usuarios.usp_id FROM items, alumnos_progreso, usuarios WHERE (items.tip_id='evaluacion') AND (items.itm_id=alumnos_progreso.itm_id) AND (usuarios.usr_id=alumnos_progreso.usr_id) AND usuarios.usr_baja IS NULL GROUP BY items.cur_id, alumnos_progreso.usr_id, usuarios.usp_id) AS lista_items_alumno WHERE (lista_items_alumno.num_items_alumno = lista_items_curso.num_items) AND (lista_items_curso.id_curso = lista_items_alumno.cur_id) GROUP BY 1,2) AS finalizados WHERE (cursos.cur_id = puntuaciones.cur_id) AND (puntuaciones.cur_id = finalizados.id_curso) AND (puntuaciones.usr_id = finalizados.id_usuario) GROUP BY 1,3) AS tabla_estado_alumnos, (SELECT cursos.cur_id AS curso, COUNT(items.cur_id) AS numero_examenes FROM cursos, items WHERE (cursos.cur_id=items.cur_id) AND (items.tip_id='evaluacion') GROUP BY 1) AS tabla_examenes_curso WHERE (tabla_estado_alumnos.curso=tabla_examenes_curso.curso)) AS tabla_final GROUP BY curso ORDER BY titulo