Foros del Web » Programando para Internet » PHP »

Promedios de registros en mysql, php?

Estas en el tema de Promedios de registros en mysql, php? en el foro de PHP en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 12/05/2008, 18:58
Avatar de Mcruzmx  
Fecha de Ingreso: abril-2006
Mensajes: 357
Antigüedad: 18 años
Puntos: 9
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)

Última edición por Mcruzmx; 12/05/2008 a las 19:19 Razón: agregar detalles
  #2 (permalink)  
Antiguo 12/05/2008, 19:56
Avatar de el cirujano  
Fecha de Ingreso: mayo-2003
Ubicación: Frente al PC
Mensajes: 609
Antigüedad: 20 años, 11 meses
Puntos: 3
Re: Promedios de registros en mysql, php?

coloca tu sentencia SQL
__________________
CSS2 + AJAX + PHP + MySQL, una mezcla sin competencia!!!!!!
  #3 (permalink)  
Antiguo 12/05/2008, 20:21
Avatar de Mcruzmx  
Fecha de Ingreso: abril-2006
Mensajes: 357
Antigüedad: 18 años
Puntos: 9
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


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
  #4 (permalink)  
Antiguo 13/05/2008, 01:05
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 7 meses
Puntos: 41
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:


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,
  #5 (permalink)  
Antiguo 13/05/2008, 01:16
Avatar de Mcruzmx  
Fecha de Ingreso: abril-2006
Mensajes: 357
Antigüedad: 18 años
Puntos: 9
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:
Iniciado por Mcruzmx Ver Mensaje
por ejemplo hay 56 preguntas (campos)
me refiero a la tabla que mencioné "test_egresados" cuyos campos son los 56 campos que escribi arriba. gracias de nuevo.

<?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

Última edición por jpinedo; 13/05/2008 a las 01:54 Razón: Es innecesario que estén separados. Menos de 5 minutos entre uno y otro
  #6 (permalink)  
Antiguo 13/05/2008, 02:04
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 7 meses
Puntos: 41
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.
  #7 (permalink)  
Antiguo 13/05/2008, 13:08
Avatar de Mcruzmx  
Fecha de Ingreso: abril-2006
Mensajes: 357
Antigüedad: 18 años
Puntos: 9
Re: Promedios de registros en mysql, php?

Cita:
Iniciado por jpinedo Ver Mensaje
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.

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.
  #8 (permalink)  
Antiguo 13/05/2008, 13:58
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 7 meses
Puntos: 41
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ó.
  #9 (permalink)  
Antiguo 13/05/2008, 14:08
Avatar de Mcruzmx  
Fecha de Ingreso: abril-2006
Mensajes: 357
Antigüedad: 18 años
Puntos: 9
Re: Promedios de registros en mysql, php?

Cita:
Iniciado por jpinedo Ver Mensaje
¿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ó.
Gracias, mas o menos entiendo (entiendo el punto, pero no entiendo como podria hacer esto o si bien me exste explicando yo)


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.
  #10 (permalink)  
Antiguo 13/05/2008, 19:36
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 7 meses
Puntos: 41
Re: Promedios de registros en mysql, php?

Cita:
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 es porque sigues pensando que todo debe ir en una sola tabla.

¿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?
  #11 (permalink)  
Antiguo 15/05/2008, 19:09
Avatar de Mcruzmx  
Fecha de Ingreso: abril-2006
Mensajes: 357
Antigüedad: 18 años
Puntos: 9
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.
  #12 (permalink)  
Antiguo 15/05/2008, 21:19
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 7 meses
Puntos: 41
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,
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 09:37.