![]() |
Promedios de registros en mysql, php? hola pues tengo una tabla en mysql, esta tabla es en si una escuesta de 56 preguntas (un campo por pregunta) y no encuentro como hacer para sacar un promedio por respuestas (registros en cada campo), bien, las respuestas las capturo por medio de un form y comboslist, es decir, no existen respuestas abiertas, cada pregunta tiene mas o menos 5 respuestas ya definidas en el combolist del form. bien, (lo guardo todo perfecto) resumo el problema: no se como sacar un promedio de los resultados, quiero imprimir algo como PREGUNTA 1 - ¿blablbala? (que viene siendo el campo) RESPUESTA 1 - 3 veces (registro 1) RESPUESTA 2 - 4 veces (registro 2) RESPUESTA 3 - 1 veces (registro 3) RESPUESTA N - x veces (registro n) PREGUNTA 2 - ¿blablbala? (que viene siendo el campo2) RESPUESTA 1 - 3 veces (registro 1) RESPUESTA 2 - 4 veces (registro 2) RESPUESTA 3 - 1 veces (registro 3) RESPUESTA N - x veces (registro n) etc. pense en usar el count y el group by pero no lo logro hacer, AGRADEZCO su ayuda por favor. gracias. Estoy utilizando PHP + Mysql (phpmyadmin) |
Re: Promedios de registros en mysql, php? coloca tu sentencia SQL |
Re: Promedios de registros en mysql, php? pues aun no la tengo, lo que tengo ahorita es esto <?php include '../connect.php'; $db_selected=mysql_select_db($databasename, $link); if (!$db_selected) { header('Location: error.php'); } echo'<div align="center"><table cellpadding="0" cellspacing="0" width="388" border="1">'; echo'<!-- MSTableType="layout" -->'; $sql=mysql_db_query("$databasename","Select escolaridad_padre,count(escolaridad_padre) as total from test_egresados group by escolaridad_padre"); while ($row=mysql_fetch_array($sql)){ echo '<tr>'; echo '<td>'.$row[0].' ('.$row['total'].')</td>'; echo '</tr>'; } echo'</table></div>'; ?> Esto lo que hace es unicamente imprimir una columna (campo, es decir pregunta) y las respuestas con las veces que esta respondido eso (algo asi como lo que quiero) pero, lo que yo quiero hacer es saber si es posible hacer lo mismo pero con todos los registros, es decir poner algo como Select *, Count(*) ..... y poder imprimir algo como $resultado["variable"] // resultado del select y otro $resultado_count["variable2"] por que si no tendre que hacer un select para 56 campos para asi poder hacer lo mismo que he hecho hasta ahora, esto es muy desesperante, por favor ayudenme u_u aqui la lista de campos de los cuales tengo que sacar un total de las respuestas (coincidencias de los registros por cada campo) id_test_egresados id_alu_realizo escolaridad_padre escolaridad_madre ocupacion_padre ocupacion_madre sosten_economico bachillerato imss_primera_op enfermeria_primera_op causa_enfermeria inicio_licenciatura termino_licenciatura realizo_servicio concluyo_servicio titulado cuando_titulado causa_no continua_estudios tipo_estudios trabajo_en_estudios relacion_enfermeria trabaja_ahora medio_encontro sector_trabaja tardo_trabajar motivo_contratacion tipo_contratacion relacion_enfermeria_ahora ocupacion_empleo escalabilidad sector horas_trabajo salarios razon_no_trabaja cataloga_imss concidera_preparacion vinculo_practica preparacion_personal preparacion_personal_parcial apoyo_recibido servicios_generales actualizacion_vigencia contenidos_tematicos recomendaria_imss razon_recomienda razon_no_recomienda habilidades_desarrolladas capacidades desarrollo_analisis creatividad_aumento capacidad_buscar etica_refirzada manejo_computo dominio_ingles fecha_realizado hora_realizado Gracias |
Re: Promedios de registros en mysql, php? Hola: Estás diciendo lo que quieres obtener, pero no de dónde. Pregunta importante: ¿Cómo has planteado la estructura de tu BD? Según como se presume, es una estructura demasiado rígida (con las preguntas como nombres de campo. Si quieres eliminar una opción, agregar una nueva pregunta al cuestionario o agregarle una respuesta a una de las preguntas tendrías que hacer modificaciones a las tablas (estructura). Plantéate una estructura como: http://img403.imageshack.us/img403/2614/encuestatr5.jpg dado el caso, si las consultas de resultados son muy frecuentes, podrías agregar un campo en la tabla "respuesta" que indique el número de veces que fue elegida. De ese modo aceleras la consulta. Saludos, |
gracias amigo por responder intentare ser mas clar, los campos que puse arriba corresponden a la tabla llamada "test_egresados" que representa a un cuestionario (encuesta) de alumnos egresados, bien, tengo otra tabla de alumnos (que viene siendo los usuarios) las respuestas ya estan definidas en un formulario html (en combo list, no hay preguntas abiertas, cada pregunta tiene definido en el combo como 5 respuestas posibles mas o menos) bueno, ahorita no me preocupa la relacion entre alumnos y el test, por que es facil (o por lo menos eso ya lo tengo y no me preocupa) lo que no se como hacer es: por ejemplo hay 56 preguntas (campos) cada pregunta puede tener (supongamos) 5 posibles valores (respuestas) entonces, yo tengo que ser capaz de contar las coincidencias de cada valor PARA CADA campo, es decir: Campo1: respuesta 1 - 5 veces respuesta 2 - 1 vez respuesta 4 - 4 veces etc. y asi con todos los campos (los 56) entonces eso es en resumen lo que no se como hacer, he intentado usar el count pero solo logro hacer esto en una columna (campo) individualmente, imaginate, tendria que hacer entonces 56 consultas, 1 para cada columna, y pues aparte el show que seria para darle diseño, necesito saber como hacer en un solo select o algo asi, nose, por favor ayudenme a hacerlo. gracias. Cita:
<?php include '../connect.php'; $db_selected=mysql_select_db($databasename, $link); if (!$db_selected) { header('Location: error.php'); } echo'<div align="center"><table cellpadding="0" cellspacing="0" width="388" border="1">'; echo'<!-- MSTableType="layout" -->'; $sql=mysql_db_query("$databasename","Select escolaridad_padre,count(escolaridad_padre) as total from test_egresados group by escolaridad_padre"); while ($row=mysql_fetch_array($sql)){ echo '<tr>'; echo '<td>'.$row[0].' ('.$row['total'].')</td>'; echo '</tr>'; } echo'</table></div>'; ?> ese es el codigo que mencione arriba que me funciona "mas o menos" a lo que necesito PERO unicamente para una columna que en este caso es escolaridad_padre, pero sigue el problema de que son 56 preguntas y pues no logro modificar el select para trabajar con todos los registros, gracias por su tiempo y ayuda, gracias. el codigo que puse anteriormente imprime lo siguiente: Bachillerato o carrera técnica incomplet (1) Ninguna (2) y esta bien por lo menos asi, pues en la tabla de test_egresados solo tengo por lo pronto 3 registros (la encuesta se ha hecho 3 veces) de las cuales "bachillerato o carrera tecnica incompleta" se ha contestado 1 vez, y "ninguna" 2 veces. ayudenme por favor, gracias |
Re: Promedios de registros en mysql, php? Te repito que la raíz del problema está en la estructura que has utilizado para la BD. De todos modos, como te dije antes, vas a ganar en velocidad si "redundas" un poquito y creas campos con el número de veces que una respuesta fue elegida. Así cada vez que un usuario llene el cuestionario, se escribirán en la BD los campos con sus respuestas y también se actualizará el contador de cada respuesta (valor anterior +1). Saludos, PD: Por favor, no repitas los temas en otros subforos. Tampoco escribas mensajes uno tras otro si no es necesario. En este caso, reporté tu tema repetido, te borré un mensaje y uní tus 4 últimos (que tenían menos de 5 minutos entre uno y otro). Si no, voy a tener que ponerte alguna infracción por suma de mensajes. Gracias por tu comprensión. |
Re: Promedios de registros en mysql, php? Cita:
ups, no entiendo lo que me dices, entiendo tu diagrama pero creo que seria mucho mas complicado hacer 3 tablas, una de respuesta (pues estamos hablando de muchas respuestas) y otra de preguntas (muchas preguntas) por que luego seria hacer funcionar la tabla de cuestionario jalar informacion de aqui y de alla, bueno, en resumen, supongo que debe de haber una manera en SQL y php de contar cada coincidencia por cada campo verdad? (56 campos) gracias. |
Re: Promedios de registros en mysql, php? ¿Pero quién te dijo que tener más tablas es complicar más las cosas? Siempre que esté bien justificado, tener más tablas puede incluso facilitarte el trabajo. Te explico lo de la redundancia que te decía: - Primero, la redundancia (bien justificada) hace que el proceso de consulta sea mucho más sencillo y rápido. Esto es porque se ahorra algunos cálculos y consultas complejas y lee directamente de un campo. - Segundo, toda redundancia hace más trabajoso y lento el proceso de escritura. O sea cuando alguien llene el cuestionario va a tener que hacer doble trabajo porque hay que escribir aquí y allá. Ahí es cuando tienes que ver si vale la pena redundar. En tu caso, creo que la escritura (las veces que se llena el cuestionario) es pequeñísima comparada con las veces que se van a consultar los resultados. Entonces te conviene redundar. ¿Y qué es redundar, en este caso? Es realizar el cálculo en el momento de escribir y no al leer. Es tener ese cálculo almacenado en algún lugar de tu BD. ¿Dónde vas a guardar este cálculo? Depende de la estructura. En el ejemplo que te puse yo, podrías agregar un campo a la tabla de respuestas. Pero, si quieres haz una nueva tabla con los resultados. Cuando alguien quiere leer los resultados, simplemente los muestras sin que la BD tenga que hacer ningún cálculo complicado. Cuando alguien escriba (llene el cuestionario) se van a actualizar dos campos por cada pregunta. El campo que tenías antes y el nuevo campo (que tomará el valor anterior +1) No sé si se entendió. |
Re: Promedios de registros en mysql, php? Cita:
por ejemplo esta es la pregunta #8 8- Escolaridad del padre o tutor: yo para que el usuario (alumno) responda tengo un combo, este es el codigo <select size="1" name="D8"> <option value="Ninguna">Ninguna</option> <option value="Primaria incompleta">Primaria incompleta</option> <option value="Primaria completa">Primaria completa</option> <option value="Secundaria incompleta">Secundaria incompleta</option> <option value="Secundaria completa">Secundaria completa</option> <option value="Bachillerato o carrera técnica incompleta">Bachillerato o carrera técnica incompleta</option> <option value="Bachillerato o carrera técnica completa">Bachillerato o carrera técnica completa</option> <option value="Profesional incompleta">Profesional incompleta</option> <option value="Profesional completa">Profesional completa</option> </select> entonces, cada pregunta (56 preguntas) tiene mas o menos la misma cantidad de respuestas, pero diferentes respuestas, entonces, si hago una tabla de respuestas pues nose se me hace complicado ir a buscar un id de respuesta y guardarlo en la tabla (test_egresados) que es donde se guarda la encuesta. me llama la atencion lo que comentas de agregar un campo e ir sumando cada vez que contesten eso, pero pues creo que no es muy posible (quizas me equivoco) teniendo en cuenta que son muchas las opciones de respuestas. eso seria quizas para contar cuando alguien contesta alguna pregunta "contesto esta pregunta, sumo 1, no la contesto, no sumo" pero no me sirve por que yo necesito saber cuantas veces por cada campo existe cierto valor (coincidencia de un registro por campo) o por lo menos asi lo entiendo. agradesco muchisimo tu ayuda y tu tiempo, gracias amigo. |
Re: Promedios de registros en mysql, php? Cita:
¿No tienes una tabla con el texto de las respuestas? Imagina que todos respondieran la 6ta opción. ¿Estás guardando el texto "Bachillerato o carrera técnica incompleta" miles de veces en la misma tabla? |
Respuesta: Promedios de registros en mysql, php? bien lo he solucionado, gracias por la ayuda de todas formas, gracias al foro. saludos. aqui por si alguien llega con un problema similar y ocupa la solucion: <?php include '../connect.php'; $db_selected=mysql_select_db($databasename, $link); if (!$db_selected) { header('Location: error.php'); } $tablex="test_egresados"; $result = mysql_query("SHOW FIELDS FROM $tablex"); //Numero total de registros (util para porcentaje) $sqlp=mysql_query("SELECT * FROM $tablex"); $total = mysql_num_rows($sqlp); while ($row = mysql_fetch_array($result)) {//OBTENEMOS EL NOMBRE DE TODOS LOS CAMPOS $fieldx=$row['Field']; //CONTAMOS LAS COINCIDENCIA POR CADA REGISTRO E IMPRIMIMOS =) $sql=mysql_query("SELECT $fieldx,count($fieldx) AS coincidencias FROM $tablex GROUP BY $fieldx"); echo '<b>'.$fieldx.'</b><br>'; while ($row2=mysql_fetch_array($sql)){ If ($row2[0]!=='-'){ echo $row2[0]; echo ' <font color="#CC6600">('; echo $row2['coincidencias'].' '; If ($row2['coincidencias']>1){ echo 'Veces'; }else{ echo 'Vez'; } echo ' contestado,'; $porcentaje=($row2['coincidencias'] / $total) * 100; echo ' Representa el '.$porcentaje.'%)'; echo '</font>'; echo '<br>'; } } echo '<hr><br>'; } ?> y justamente me da un resultado como el que yo queria: id_test_egresados 2008050617580222 (1 Vez contestado, Representa el 25%) 2008051018314415 (1 Vez contestado, Representa el 25%) 2008051018320215 (1 Vez contestado, Representa el 25%) 2008051517255515 (1 Vez contestado, Representa el 25%) -------------------------------------------------------------------------------- id_alu_realizo 02330858 (4 Veces contestado, Representa el 100%) -------------------------------------------------------------------------------- escolaridad_padre Bachillerato o carrera técnica incomplet (2 Veces contestado, Representa el 50%) Ninguna (2 Veces contestado, Representa el 50%) -------------------------------------------------------------------------------- escolaridad_madre Ninguna (2 Veces contestado, Representa el 50%) Bachillerato o carrera técnica incomplet (1 Vez contestado, Representa el 25%) Secundaria completa (1 Vez contestado, Representa el 25%) -------------------------------------------------------------------------------- ocupacion_padre Actividad técnica independiente (o (1 Vez contestado, Representa el 25%) Empleado (1 Vez contestado, Representa el 25%) Ninguna (2 Veces contestado, Representa el 50%) etc. Saludos y gracias de nuevo. |
Respuesta: Promedios de registros en mysql, php? Ya sabes lo que opino. Como ejercicio está bien. Pero en la práctica, tu solución -de hacer cerca de 60 consultas- es muy (pero muy) poco eficiente. Saludos, |
| La zona horaria es GMT -6. Ahora son las 23:14. |
Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.