Comunidad de diseño web y desarrollo en internet online

Este código tan tonto me tira el MySQL, alguien me ayuda?

Citar            
MensajeEscrito el 14 Ago 2010 12:56 am
La verdad es que es autoexplicativo, el problema es que aunque funciona cuando hay muchos registros deja tirado el servidor....

Código PHP :

<?
include("conexion.php");
//parámetro de entrada tipobusqueda:
//1: ordenado por popularidad
//2: ordenado por fecha alta
//3: al azar
/*$post_tipo = 2;
$post_idusuario = 0;
*/
$tipo = $post_tipo;

$idusuario = $post_idusuario;

switch ($tipo) {
   case 1:
      $sql = "select distinct(f.id) as idFoto, f.numVotos, r.nombre, r.apellido1, r.apellido2, f.fechaAlta, f.foto,  coalesce(f.ganadorMes,0) as ganador  from  tabla_fotos f, tabla_registrados r  where f.idUsuario = r.id and f.estado=1 and f.idUsuario not in (select f2.idUsuario from tabla_fotos f2 where f2.ganadorMes<>0)  group by f.id  order by f.numVotos desc";
      break;
   case 2:
      //$sql = "select distinct(f.id) as idFoto, f.numVotos, r.nombre, r.apellido1, r.apellido2, f.fechaAlta, f.foto   from tabla_fotos f, tabla_registrados r where f.idUsuario = r.id and f.estado=1 group by f.id order by f.fechaAlta desc ";
      //LOS MAS VOTADOS DEL MES ACTUAL.
      //$sql = "select distinct(f.id) as idFoto, f.numVotos, r.nombre, r.apellido1, r.apellido2, f.fechaAlta, f.foto  from  tabla_fotos f, tabla_registrados r, tabla_votos as v where f.idUsuario = r.id and f.estado=1 and v.idFoto=idFoto and month(v.fecha)=month(now()) and year(v.fecha)=year(now()) group by f.id  order by f.numVotos desc";
      //las fotos ordenadas por subida del mes actual
      $sql = "select distinct(f.id) as idFoto, f.numVotos, r.nombre, r.apellido1, r.apellido2, f.fechaAlta, f.foto,  coalesce(f.ganadorMes,0) as ganador  from  tabla_fotos f, tabla_registrados r, tabla_votos as v where f.idUsuario = r.id and f.estado=1 and v.idFoto=idFoto and month(v.fecha)=month(now()) and year(v.fecha)=year(now()) and f.idUsuario not in (select f2.idUsuario from tabla_fotos f2 where f2.ganadorMes<>0) group by f.id  order by f.fechaAlta desc";
      break;
   case 3:
      $ind = rand(1,6);
      $sql = "select distinct(f.id) as idFoto, f.numVotos, r.nombre, r.apellido1, r.apellido2, f.fechaAlta, f.foto,  coalesce(f.ganadorMes,0) as ganador   from  tabla_fotos f, tabla_registrados r where f.idUsuario = r.id and f.estado=1 and f.idUsuario not in (select f2.idUsuario from tabla_fotos f2 where f2.ganadorMes<>0) group by f.id order by ".$ind." desc";
      break;
   case 4:
      $sql = "select v.idFoto, count(*) as numVotos, r.nombre, r.apellido1, r.apellido2, f.foto,  coalesce(f.ganadorMes,0) as ganador  from tabla_votos v, tabla_fotos f, tabla_registrados r where month(v.fecha)= month(curdate()) and year(v.fecha)=year(now()) and f.id = v.idFoto and f.idUsuario = r.id and f.estado='1' and f.idUsuario not in (select f2.idUsuario from tabla_fotos f2 where f2.ganadorMes<>0) group by v.idFoto  order by numVotos desc";
      break;      
}

$result = mysql_query($sql, $DB);
echo ('<?xml version="1.0" encoding="utf-8"?>');
echo ('<raiz>');
$i = 1;

while ($row = mysql_fetch_assoc($result)){
   //si la fecha actual es mayor que la anterior, hay que parar porque ya tenemos los ganadores de cada mes. A partir de este punto, empezaría con los segundos de cada mes,...
   if ($i != 1){
      if ($fechaAnt < $row['fecha']){
         exit();   
      }
   }   
   if ($idusuario > 0 ){
      $sql = "select * from tabla_votos where idUsuario = ".$idusuario." and idFoto = ".$row['idFoto'];
      $result2 = mysql_query($sql, $DB);
      if (mysql_num_rows($result2) > 0){
         $ha_votado = 1;   
      }
      else {
         $ha_votado = 0;   
      }
   }
   else {
      $ha_votado = -1;
   }
   $fechaAnt = $row['fecha'];   
   $nombre = $row['nombre'];
   $apellido1 = $row['apellido1'];
   $apellido2 = $row['apellido2'];
   $numvotos = $row['numVotos'];
   $nombreFoto = $row['foto'];
   $idFoto = $row['idFoto'];
   $ganador = $row['ganador'];
   
   if ($ganador > 0){ //NO PUEDE VOTAR PORQUE YA HA RESULTADO GANADOR EN OTRO MES
      $ha_votado = -2;   
   }   
   
   echo('<foto_'.$i.'>');
      echo('<usuario>'.$nombre.' '.$apellido1.' '.$apellido2.'</usuario>');
      echo('<numVotos>'.$numvotos.'</numVotos>');
      echo('<haVotado>'.$ha_votado.'</haVotado>');
      echo('<nombreFoto>'.$nombreFoto.'</nombreFoto>');
      echo('<idfoto>'.$idFoto.'</idfoto>');      
   echo('</foto_'.$i.'>');      
   $i++;
}

echo ('</raiz>');      

?>

Por 12monkeys

1 de clabLevel



 

firefox
Citar            
MensajeEscrito el 14 Ago 2010 04:32 am
una pregunta en la parte del codigo:

Código PHP :

$tipo = $post_tipo; 
$idusuario = $post_idusuario; 

las variables de la derecha son variables globales? O son enviadas desde otra pagina

Por bucle_infinito

Claber

166 de clabLevel

1 tutorial

 

.NET Developer

firefox
Citar            
MensajeEscrito el 14 Ago 2010 05:29 am
no entiendo si tu pregunta es con mysql o con php , muestrame ambas de manera separada y de manera separada pruebalas, para eso simplemente imprime el sql en ves de ejecutarlo y ya

Por Inyaka

Claber

3176 de clabLevel

9 tutoriales
2 articulos

Genero:Masculino   Desarrollador de GAIA

Programador y fotógrafo

firefox
Citar            
MensajeEscrito el 15 Ago 2010 12:54 am
Hola MP:

Gracias, la pregunta es sobre el MySQL que con una query tan compleja se queda muerto, pero creo que además con algo de PHP se podría optimizar la consulta, el problema es que tira una consulta hacia 3 tablas en el 2º case y se muere.

El MySQL funciona, lo que quisiera es ver cómo optimizar la consulta o cómo no dejarle todo el trabajo a MySQL, para que sea PHP quien ayude un poco..

Existen procedimientos almacenados como en SQL server?

Además el XML resultante es muy grande por lo que quizá también ayudara algun tipo de paginado PHP...

A la pregunta de las variables, se reciben por POST desde otra página.

Gracias

Por 12monkeys

1 de clabLevel



 

firefox
Citar            
MensajeEscrito el 15 Ago 2010 01:56 am
procedimeintos almacenados, triggers, funciones, sentencias de control, particiones de tablas, etc...

pero primero debes saber separar lo que es sql a lo que es php, controlador y modelo, son completamente separado ;)

Por Inyaka

Claber

3176 de clabLevel

9 tutoriales
2 articulos

Genero:Masculino   Desarrollador de GAIA

Programador y fotógrafo

firefox
Citar            
MensajeEscrito el 15 Ago 2010 02:01 am
A ver, hasta ahi llego ;) lo que quiero decir es si hay alguna manera desde MySQL de que la Query tenga mejor rendimiento o si mediante PHP se puede hacer que el resultado sea filtrado en parte desde el resultado de la consulta.

En definitiva, crees que ese código puede optimizarse de algun modo, el prob es que llamar a varias tablas simultanemanet mediante queries soamente y que son estresadas constantemente debería tener un método de optimización más evidente que tirar código sin más.

Leyendolo creo que se entiende bastante bien lo que se pretende.

GRACIAS por el trabajo altruista que realizais!!!

Por 12monkeys

1 de clabLevel



 

firefox
Citar            
MensajeEscrito el 15 Ago 2010 03:52 am
Creo que lo te hace falta es leer más sobre sql. Tanto inner join, left join y condiciones dentro de sentencias sql.

Por lo menos esa sentencia que tienes dentro del bucle while de seguro puedes ponerla en los sql del case y eliminarias tanto una condicion en php como una peticion a MySQL.

saludos

Por Maikel

BOFH

5575 de clabLevel

22 tutoriales
5 articulos

Genero:Masculino   Team Cristalab

Claber de baja indefinida

firefox
Citar            
MensajeEscrito el 15 Ago 2010 07:02 am

Por Inyaka

Claber

3176 de clabLevel

9 tutoriales
2 articulos

Genero:Masculino   Desarrollador de GAIA

Programador y fotógrafo

firefox

   Página 1 de 1

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.