Foros del Web » Programando para Internet » PHP »

Query execution was interrupted

Estas en el tema de Query execution was interrupted en el foro de PHP en Foros del Web. Hola a todos, como todo novato es que tengo una gran laguna mental en la cual no puedo salir. Tengo esta consulta la cual funciona ...
  #1 (permalink)  
Antiguo 16/10/2013, 07:07
 
Fecha de Ingreso: abril-2011
Mensajes: 49
Antigüedad: 13 años
Puntos: 3
Query execution was interrupted

Hola a todos, como todo novato es que tengo una gran laguna mental en la cual no puedo salir. Tengo esta consulta la cual funciona muy bien. Me devuelve la cantidad de alumnos que han asistido al menos a una clase por cada curso.

Código SQL:
Ver original
  1. //verifico que al menos haya asistido a una clase
  2.     SELECT r0.dni, r2.apellido_nombre, COUNT(r0.dni) Cant_presente, r1.teoricas, ( (COUNT(r0.dni) * 100) / r1.teoricas ) porcentaje, r1.actividad FROM asistencia r0
  3.                     INNER JOIN inscripciones r3 ON r3.id_act = r0.id_act
  4.                     INNER JOIN actividades r1 ON r1.id_act = r0.id_act
  5.                     INNER JOIN alumnos r2 ON r2.dni = r0.dni
  6.                     WHERE r0.dni=r3.dni AND r3.id_act=$identificacion_curso AND (r0.asistencia = 'presente' OR r0.asistencia='P')
  7.                     GROUP BY r0.dni, r0.id_act
  8.                     HAVING porcentaje >= 1
  9.                     ORDER BY r1.actividad ;



la cual la muestro asi:

Código PHP:
Ver original
  1. $totalrows02=mysql_num_rows ($result02);
  2. echo $totalrows02;

El problema es que ahora necesito saber el rango de edades de esos alumnos asistidos al menos a una clase. En la base he hecho una view en donde tengo todas las edades de todos los alumnos, sin filtrar por asistencias, ni inscripción de cursos ni nada. La consulta es esta:

Código SQL:
Ver original
  1. //cuento edades
  2.     SELECT r0.dni, r2.apellido_nombre, COUNT(r0.dni) Cant_presente, r1.teoricas, ( (COUNT(r0.dni) * 100) / r1.teoricas ) porcentaje, r1.actividad, r4.edad
  3.                     FROM asistencia r0
  4.                     INNER JOIN inscripciones r3 ON r3.id_act = r0.id_act
  5.                     INNER JOIN actividades r1 ON r1.id_act = r0.id_act
  6.                     INNER JOIN alumnos r2 ON r2.dni = r0.dni
  7.                     INNER JOIN alumnosedades r4 ON r4.id_act = r0.id_act
  8.                     WHERE r0.dni=r3.dni AND r3.id_act=$identificacion_curso AND (r0.asistencia = 'presente' OR r0.asistencia='P') AND r4.edad > 25
  9.                     GROUP BY r0.dni, r0.id_act
  10.                     HAVING porcentaje >= 1
  11.                     ORDER BY r1.actividad

y la quiero mostar así, todo esto también dentro del mismo while:

Código PHP:
Ver original
  1. $ver_edades=mysql_num_rows($edades);
  2. echo $ver_edades;

pero me devuelve el error " Query execution was interrupted ". Ya he intentado hacer todo tipo de cambios pero no logro que me cuente , por ej, la cantidad de alumnos mayores de 25 años que asistieron al menos a una clase. Desde ya muchas gracias y espero ansiosamente que puedan entenderme y ayudarme.

Última edición por Triby; 16/10/2013 a las 10:10 Razón: Highlight SQL
  #2 (permalink)  
Antiguo 16/10/2013, 07:38
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 12 años, 7 meses
Puntos: 397
Respuesta: Query execution was interrupted

Una pregunta, por lógica la tabla de alumnosedades no deberia depender de la tabla alumnos? digo ya que no veo lógico que dependa de asistencia

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #3 (permalink)  
Antiguo 16/10/2013, 08:09
 
Fecha de Ingreso: abril-2011
Mensajes: 49
Antigüedad: 13 años
Puntos: 3
Respuesta: Query execution was interrupted

Si entiendo lo que me dices y es cierto. Pero lo que sucede es que primero debo calcular los alumnos que al menos tienen una asistencia (de ahi la relacion con asistencia) y luego, a partir de eso sacar los alumnos con determinados rango de edad. La verdad es que no entiendo muy bien como hacer la query. El tema es que si la consulta del calculo de asistencia me funciona muy bien.

Copio código:

Código PHP:
Ver original
  1. //verifico que al menos haya asistido a una clase
  2.                $result02=mysql_query ("SELECT r0.dni, r2.apellido_nombre, count(r0.dni) Cant_presente, r1.teoricas, ( (count(r0.dni) * 100) / r1.teoricas ) porcentaje, r1.actividad FROM asistencia r0
  3.            INNER JOIN inscripciones r3 ON r3.id_act = r0.id_act
  4.            INNER JOIN actividades r1 ON r1.id_act = r0.id_act
  5.            INNER JOIN alumnos r2 ON r2.dni = r0.dni
  6.            WHERE r0.dni=r3.dni AND r3.id_act=$identificacion_curso AND (r0.asistencia = 'presente' OR r0.asistencia='P')
  7.            GROUP BY r0.dni, r0.id_act
  8.            HAVING porcentaje >= 1
  9.            ORDER BY r1.actividad ");

como hago para adaptar esta consulta al otro resultado que quiero. Como dije mas arriba, yo tengo en la base una view llamada alumnosedades con los campos apellido_nombre, dni, edad, id_act

con esta consulta sql hice la view
Código SQL:
Ver original
  1. CREATE VIEW `alumnosedades` AS
  2.  
  3. SELECT alumnos.apellido_nombre, alumnos.dni, actividades.id_act YEAR( CURDATE() ) - YEAR(date_format( str_to_date(fecha_nacimiento, '%d/%m/%Y' ), '%Y%m%d' ) ) edad FROM alumnos, actividades
  #4 (permalink)  
Antiguo 16/10/2013, 08:20
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 12 años, 7 meses
Puntos: 397
Respuesta: Query execution was interrupted

Si la tabla alumnos tiene el campo de fecha de nacimiento no veo entonces el problema, no llames a la view (que de por si tiene un error: después de actividades.id_act deberia ir una coma (,) )

Código SQL:
Ver original
  1. SELECT r0.dni, r2.apellido_nombre, COUNT(r0.dni) Cant_presente, r1.teoricas, ( (COUNT(r0.dni) * 100) / r1.teoricas ) porcentaje, r1.actividad, YEAR( CURDATE() ) - YEAR(date_format( str_to_date(r2.fecha_nacimiento, '%d/%m/%Y' ), '%Y%m%d' ) ) edad
  2. FROM asistencia r0
  3.     INNER JOIN inscripciones r3 ON r3.id_act = r0.id_act
  4.     INNER JOIN actividades r1 ON r1.id_act = r0.id_act
  5.     INNER JOIN alumnos r2 ON r2.dni = r0.dni
  6.     WHERE r0.dni=r3.dni
  7.         AND r3.id_act=$identificacion_curso
  8.         AND (r0.asistencia = 'presente' OR r0.asistencia='P')
  9.         AND edad > 25
  10.     GROUP BY r0.dni, r0.id_act
  11.     HAVING porcentaje >= 1
  12.     ORDER BY r1.actividad ;

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #5 (permalink)  
Antiguo 23/10/2013, 06:10
 
Fecha de Ingreso: abril-2011
Mensajes: 49
Antigüedad: 13 años
Puntos: 3
Respuesta: Query execution was interrupted

Hola amigos después de unos días de ausencia me hago presente para comentar que he solucionado mi problema a través de la siguiente consulta la cual no estaba muy errada con respecto a la original.

Código PHP:
Ver original
  1. $edades=mysql_query("SELECT r0.dni, r2.apellido_nombre, count(r0.dni) Cant_presente, r1.teoricas, ( (count(r0.dni) * 100) / r1.teoricas ) porcentaje, r1.actividad, r4.edad FROM asistencia r0
  2.                INNER JOIN inscripciones r3 ON r3.id_act = r0.id_act
  3.                 INNER JOIN actividades r1 ON r1.id_act = r0.id_act
  4.                 INNER JOIN alumnos r2 ON r2.dni = r0.dni
  5.                 INNER JOIN alumnosedades r4 ON r4.dni = r0.dni
  6.                 WHERE r0.dni=r3.dni AND r3.id_act=$identificacion_curso AND (r0.asistencia = 'presente' OR r0.asistencia='P')
  7.                 GROUP BY r0.dni, r0.id_act  
  8.                 HAVING r4.edad = 25 and porcentaje >= 1
  9.                 ORDER BY r1.actividad") or die("Error en: $edades: " . mysql_error()) ;
  10.  
  11. $ver_edades=mysql_num_rows($edades);
  12.  
  13. echo $ver_edades;

Hasta aquí todo bien, pero ahora el problema, que no se porque sucede, es que me tarda muchisimo en mostrar los resultados de la consulta. La base y el sistema está todo montado en un servidor remoto donde también tengo mi sitio web.
  #6 (permalink)  
Antiguo 23/10/2013, 07:00
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: Query execution was interrupted

GROUP BY y ORDER BY son cláusulas asesinas de performance. Son los procesos que más tiempo consumen, en especial si la cantidad de registros es elevada.
Habría que analizar el funcionamiento con EXPLAIN, para ver dónde se puede mejorar, qué indices se pueden crear, y dónde está consumiendo principalmente los recusos.
Esto sería lo que debes correr desde el phpMyadmin (no lo hagas desde PHP), y mostrarnos el resultado compelto de la tabla:
Código MySQL:
Ver original
  1. EXPLAIN SELECT   r0.dni, r2.apellido_nombre, COUNT (r0.dni) Cant_presente,
  2.          r1.teoricas, ((COUNT (r0.dni) * 100) / r1.teoricas) porcentaje,
  3.          r1.actividad, r4.edad
  4.     FROM asistencia r0 INNER JOIN inscripciones r3 ON r3.id_act = r0.id_act
  5.          INNER JOIN actividades r1 ON r1.id_act = r0.id_act
  6.          INNER JOIN alumnos r2 ON r2.dni = r0.dni
  7.          INNER JOIN alumnosedades r4 ON r4.dni = r0.dni
  8.    WHERE r0.dni = r3.dni
  9.      AND r3.id_act = $identificacion_curso
  10.      AND (   r0.asistencia = 'presente'
  11.           OR r0.asistencia = 'P')
  12. GROUP BY r0.dni, r0.id_act
  13.   HAVING r4.edad = 25
  14.      AND porcentaje >= 1
  15. ORDER BY r1.actividad
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 23/10/2013, 16:41
 
Fecha de Ingreso: abril-2011
Mensajes: 49
Antigüedad: 13 años
Puntos: 3
Respuesta: Query execution was interrupted

Hola gnzsoloyo desde ya muchas gracias por contestar. He seguidos tus consejos, que por cierto me han sido muy útil, ya que no tenía conocimientos de este recurso.
Como verás soy novato. Aquí te copio el resultado. Por lo que estube viendo parece estar bastante lento todo. Te comento que tengo indexada la fila dni de la tabla alumnos; id_act y dni de inscripciones; id_act, dni y asistencia de asistencia.

Código HTML:
Ver original
  1. <table id="table_results" class="data ajax"><thead><tr>
  2. <th class="draggable" data-column="id">id
  3. </th><th class="draggable" data-column="select_type">select_type
  4. </th><th class="draggable" data-column="table">table
  5. </th><th class="draggable" data-column="type">type
  6. </th><th class="draggable" data-column="possible_keys">possible_keys
  7. </th><th class="draggable" data-column="key">key
  8. </th><th class="draggable" data-column="key_len">key_len
  9. </th><th class="draggable" data-column="ref">ref
  10. </th><th class="draggable" data-column="rows">rows
  11. </th><th class="draggable" data-column="Extra">Extra
  12. </th>
  13. <td></td></tr></thead><tbody>
  14. <tr class="odd"><td class="right data  not_null    nowrap ">1</td>
  15. <td class="data  not_null    ">SIMPLE</td>
  16. <td class="data      ">r2</td>
  17. <td class="data      ">ALL</td>
  18. <td class="data      ">indice standar</td>
  19. <td class="data       null"><i>NULL</i></td><td class="data       null"><i>NULL</i></td><td class="data       null"><i>NULL</i></td><td class="right data      nowrap ">12580</td>
  20. <td class="data  not_null    ">Using temporary; Using filesort</td>
  21. </tr>
  22. <tr class="even"><td class="right data  not_null    nowrap ">1</td>
  23. <td class="data  not_null    ">SIMPLE</td>
  24. <td class="data      ">r3</td>
  25. <td class="data      ">ref</td>
  26. <td class="data      ">Indice Standar,id_act</td>
  27. <td class="data      ">Indice Standar</td>
  28. <td class="data      ">102</td>
  29. <td class="data      ">frural_programa.r2.dni</td>
  30. <td class="right data      nowrap ">1</td>
  31. <td class="data  not_null    nowrap "></td></tr>
  32. <tr class="odd"><td class="right data  not_null    nowrap ">1</td>
  33. <td class="data  not_null    ">SIMPLE</td>
  34. <td class="data      ">r1</td>
  35. <td class="data      ">eq_ref</td>
  36. <td class="data      ">PRIMARY</td>
  37. <td class="data      ">PRIMARY</td>
  38. <td class="data      ">4</td>
  39. <td class="data      ">frural_programa.r3.id_act</td>
  40. <td class="right data      nowrap ">1</td>
  41. <td class="data  not_null    nowrap "></td></tr>
  42. <tr class="even"><td class="right data  not_null    nowrap ">1</td>
  43. <td class="data  not_null    ">SIMPLE</td>
  44. <td class="data      ">r0</td>
  45. <td class="data      ">ref</td>
  46. <td class="data      ">indice standard,id_act,asistencia</td>
  47. <td class="data      ">indice standard</td>
  48. <td class="data      ">102</td>
  49. <td class="data      ">frural_programa.r3.dni</td>
  50. <td class="right data      nowrap ">4</td>
  51. <td class="data  not_null    ">Using where</td>
  52. </tr>
  #8 (permalink)  
Antiguo 23/10/2013, 16:43
 
Fecha de Ingreso: abril-2011
Mensajes: 49
Antigüedad: 13 años
Puntos: 3
Respuesta: Query execution was interrupted

Como no supe como pasarte el resultado te lo pase en formato html para que lo puegues en el editor y lo veas mejor. Aquí te lo paso también en texto plano pero creo que no está muy claro.


id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE r2 ALL indice standar NULL NULL NULL 12580 Using temporary; Using filesort
1 SIMPLE r3 ref Indice Standar,id_act Indice Standar 102 frural_programa.r2.dni 1
1 SIMPLE r1 eq_ref PRIMARY PRIMARY 4 frural_programa.r3.id_act 1
1 SIMPLE r0 ref indice standard,id_act,asistencia indice standard 102 frural_programa.r3.dni 4 Using where
  #9 (permalink)  
Antiguo 28/10/2013, 07:16
 
Fecha de Ingreso: abril-2011
Mensajes: 49
Antigüedad: 13 años
Puntos: 3
Respuesta: Query execution was interrupted

Hola aún sigo sin poder optimizar las consultas. Me sería de gran ayuda que me den una mano. Estoy desorientado, tarda muchísimo en obtener los resultados. Saludos y quedo a la espera de algún comentario que me despeje de este embrollo.

Etiquetas: query, select, 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 21:46.