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

Optimizar consulta

Estas en el tema de Optimizar consulta en el foro de Bases de Datos General en Foros del Web. Hola: Estoy realizando un sistema de estadísticas y ya he logrado que funcione a la perfección, bueno ???. Ahora tengo esto: Código PHP:   $sowin  =  ...
  #1 (permalink)  
Antiguo 15/12/2004, 12:07
Avatar de Reynier  
Fecha de Ingreso: noviembre-2002
Ubicación: Por ahí en algún sitio
Mensajes: 1.844
Antigüedad: 21 años, 5 meses
Puntos: 1
Optimizar consulta

Hola:
Estoy realizando un sistema de estadísticas y ya he logrado que funcione a la perfección, bueno ???. Ahora tengo esto:
Código PHP:
  $sowin "SELECT COUNT(ipusuario) AS totalwin FROM estadisticas WHERE (sistemaoperativo=1)";
  
$reswin mysql_query($sowin) or die(_DBERR);
  
$fetchwin mysql_fetch_array($reswin);
  
$porcientowin = (100*$fetchwin['totalwin'])/$total;
  
$somac "SELECT COUNT(ipusuario) AS totalmac FROM estadisticas WHERE (sistemaoperativo=2)";
  
$resmac mysql_query($somac) or die(_DBERR);
  
$fetchmac mysql_fetch_array($resmac);
  
$porcientomac = (100*$fetchmac['totalmac'])/$total;
  
$solin "SELECT COUNT(ipusuario) AS totallin FROM estadisticas WHERE (sistemaoperativo=3)";
  
$reslin mysql_query($solin) or die(_DBERR);
  
$fetchlin mysql_fetch_array($reslin);
  
$porcientolin = (100*$fetchlin['totallin'])/$total;
  
$sobsd "SELECT COUNT(ipusuario) AS totalbsd FROM estadisticas WHERE (sistemaoperativo=4)";
  
$resbsd mysql_query($sobsd) or die(_DBERR);
  
$fetchbsd mysql_fetch_array($resbsd);
  
$porcientobsd = (100*$fetchbsd['totalbsd'])/$total;
  
$sosun "SELECT COUNT(ipusuario) AS totalsun FROM estadisticas WHERE (sistemaoperativo=5)";
  
$ressun mysql_query($sosun) or die(_DBERR);
  
$fetchsun mysql_fetch_array($ressun);
  
$porcientosun = (100*$fetchsun['totalsun'])/$total;
  
$soiri "SELECT COUNT(ipusuario) AS totaliri FROM estadisticas WHERE (sistemaoperativo=6)";
  
$resiri mysql_query($soiri) or die(_DBERR);
  
$fetchiri mysql_fetch_array($resiri);
  
$porcientoiri = (100*$fetchiri['totaliri'])/$total;
  
$sobeo "SELECT COUNT(ipusuario) AS totalbeo FROM estadisticas WHERE (sistemaoperativo=7)";
  
$resbeo mysql_query($sobeo) or die(_DBERR);
  
$fetchbeo mysql_fetch_array($resbeo);
  
$porcientobeo = (100*$fetchbeo['totalbeo'])/$total;
  
$soos2 "SELECT COUNT(ipusuario) AS totalos2 FROM estadisticas WHERE (sistemaoperativo=8)";
  
$resos2 mysql_query($soos2) or die(_DBERR);
  
$fetchos2 mysql_fetch_array($resos2);
  
$porcientoos2 = (100*$fetchos2['totalos2'])/$total;
  
$soaix "SELECT COUNT(ipusuario) AS totalaix FROM estadisticas WHERE (sistemaoperativo=9)";
  
$resaix mysql_query($soaix) or die(_DBERR);
  
$fetchaix mysql_fetch_array($resaix);
  
$porcientoaix = (100*$fetchaix['totalaix'])/$total;

  
$navope "SELECT COUNT(ipusuario) AS totalope FROM estadisticas WHERE (navegador=1)";
  
$resnav mysql_query($navope) or die(_DBERR);
  
$fetchope mysql_fetch_array($resnav);
  
$porcientoope = (100*$fetchope['totalope'])/$total;
  
$naviex "SELECT COUNT(ipusuario) AS totaliex FROM estadisticas WHERE (navegador=2)";
  
$resnav mysql_query($naviex) or die(_DBERR);
  
$fetchiex mysql_fetch_array($resnav);
  
$porcientoiex = (100*$fetchiex['totaliex'])/$total;
  
$navlyn "SELECT COUNT(ipusuario) AS totallyn FROM estadisticas WHERE (navegador=3)";
  
$resnav mysql_query($navlyn) or die(_DBERR);
  
$fetchlyn mysql_fetch_array($resnav);
  
$porcientolyn = (100*$fetchlyn['totallyn'])/$total;
  
$navwtv "SELECT COUNT(ipusuario) AS totalwtv FROM estadisticas WHERE (navegador=4)";
  
$resnav mysql_query($navwtv) or die(_DBERR);
  
$fetchwtv mysql_fetch_array($resnav);
  
$porcientowtv = (100*$fetchwtv['totalwtv'])/$total;
  
$navkon "SELECT COUNT(ipusuario) AS totalkon FROM estadisticas WHERE (navegador=5)";
  
$resnav mysql_query($navkon) or die(_DBERR);
  
$fetchkon mysql_fetch_array($resnav);
  
$porcientokon = (100*$fetchkon['totalkon'])/$total;
  
$navmoz "SELECT COUNT(ipusuario) AS totalmoz FROM estadisticas WHERE (navegador=6)";
  
$resnav mysql_query($navmoz) or die(_DBERR);
  
$fetchmoz mysql_fetch_array($resnav);
  
$porcientomoz = (100*$fetchmoz['totalmoz'])/$total;
  
$navnet "SELECT COUNT(ipusuario) AS totalnet FROM estadisticas WHERE (navegador=7)";
  
$resnav mysql_query($navnet) or die(_DBERR);
  
$fetchnet mysql_fetch_array($resnav);
  
$porcientonet = (100*$fetchnet['totalnet'])/$total;
  
$navotr "SELECT COUNT(ipusuario) AS totalotr FROM estadisticas WHERE (navegador=8)";
  
$resnav mysql_query($navotr) or die(_DBERR);
  
$fetchotr mysql_fetch_array($resnav);
  
$porcientootr = (100*$fetchotr['totalotr'])/$total
y lo que quiero hacer es optimizar un poco ese código para hacer más legible y pequeñas las cosas.

Salu2
__________________
Ing. Reynier Pérez Mira
  #2 (permalink)  
Antiguo 15/12/2004, 14:41
 
Fecha de Ingreso: julio-2003
Ubicación: España
Mensajes: 723
Antigüedad: 20 años, 9 meses
Puntos: 0
Yo lo haría así:

/*Para empezar envío una sola consulta de la que extraigo todos los datos, al fin y al cabo los vamos a tener que leer todos*/

$consulta = "SELECT ipusuario,sistemaoperativo FROM estadisticas";
$id_conexion=mysql_connect($servidor,$usuario,$con t);
$tabla=mysql_select_db($bd,$id_conexion);
$resultado=mysql_query($consulta,$id_conexion);

//Calculamos el número de registros para luego poder recorrerlos con un bucle
$filas=mysql_num_rows($resultado);

//recorremos el bucle comprobando los distintos valores de sistemaoperativo que viene siendo mysql_result($resultado,$i,1)

for ($i=0;$i<$filas;$i++){

if (mysql_result($resultado,$i,1)=="Windows"){
//aqui voy contando los usuarios que tienen windows
$windows++;
}
elseif (mysql_result($resultado,$i,1)=="Mac"){
//numero de usuarios que tienen mac
$mac++;
}
elseif (mysql_result($resultado,$i,1)=="Linux"){
$linux++;
}
elseif (mysql_result($resultado,$i,1)=="Otros"){
$otros++;
}
//aquí hacemos tantas comparaciones como queramos

}//fin del bucle


//para comprobar que esta bien podemos sumar todos los sistemas operativos y tiene que dar lo mismo que $filas

$total=$windows + $linux + $mac + $otros;

if ($total==$filas) echo "Todo correcto";

//para calcular el porcentage

$porcentage_windows = (100 * $windows) / $filas;
$porcentage_linux = (100 * $llinux) / $filas;
$porcentage_mac = (100 * $mac) / $filas;
$porcentage_otros = (100 * $otros) / $filas;

//comprobamos que la información es correcta con echo sacando el porcentage con 2 decimales

echo "Usuarios que usan windows ".$windows." (".round($porcentage_windows,2).")";
echo "Usuarios que tienen linux ".$linux." (".round($porcentage_linux,2).")";
echo "Usuarios con mac ".$mac." (".round($porcentage_mac,2).")";
echo "Usuarios con otro so ".$otros." (".round($porcentage_otros,2).")";

De esta manera nos evitamos sobrecargar inútilmente a la base de datos.

Para el navegador otro tanto de lo mismo, de echo puedes hacer así:

$consulta = "SELECT ipusuario,sistemaoperativo,navegador FROM estadisticas";

y luego

for ($i=0;$i<$filas;$i++){

if (mysql_result($resultado,$i,2)=="Internet Explorer"){
//aqui voy contando los usuarios que usan Internet Explorer
$ie++;
}
...
}

Si hay algo que no se entiende aquí estaré.

Saludos.
__________________
Solo nosotros podemos decidir qué hacer con el tiempo que se nos ha dado. (Gandalf)

Última edición por DjNelson; 15/12/2004 a las 14:56
  #3 (permalink)  
Antiguo 16/12/2004, 06:40
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
mmm .. Creo que agrupando por "sistemaoperativo" ya tendrías lo que buscas en una sóla sentencia SQL .. Recuerda que en SQL se pueden hacer operaciones matemáticas (como ese porcentaje que por ahí calculas) y también puedes usar funciones tipo SUM() (sumatorio) .. y demás.

Empieza por algo tipo:
SELECT COUNT(ipusuario) as subtotales FROM estadisticas GROUP BY sistemaoperativo

Un saludo,
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 09:31.