Foros del Web » Programando para Internet » PHP »

consulta mysql con php en varias tablas y armar excel

Estas en el tema de consulta mysql con php en varias tablas y armar excel en el foro de PHP en Foros del Web. Hola, tengo una duda, yo tengo varias tablas de mysql, y necesito armar un excel que contenga valores de varias de ellas. antes que nada, ...
  #1 (permalink)  
Antiguo 07/08/2016, 16:36
 
Fecha de Ingreso: agosto-2008
Ubicación: Buenos Aires
Mensajes: 247
Antigüedad: 16 años, 3 meses
Puntos: 6
consulta mysql con php en varias tablas y armar excel

Hola, tengo una duda, yo tengo varias tablas de mysql, y necesito armar un excel que contenga valores de varias de ellas.
antes que nada, aviso que lo que arme funciona, pero tarda muchisimo en armar el excel. supongo que alguien que sepa me podra dar alguna idea de como mejorarlo para que sea mas rapido. o por donde ver para que mejore

les detallo mejor:
tengo 3 tablas: afiliado, familia, aportes.

Yo en el excel tengo que tener: los familiares que estan dentro de cierta edad(los obtengo de tabla familia), con algunos datos de los padres( los obtengo de la tabla afiliado) y los aportes de los padres de ciertas fechas( los obtengo de la tabla aportes), hay una condicion mas, que es, que se puede haber dado de baja y alta dos veces el mismo afiliado (lo obtengo de afiliado) lo cual hace que este dos veces en aportes , en este caso, tambien, consulto los aportes del numero de afiliado anterior( lo obtengo de aportes)

ahora les paso el codigo que estoy usando alivianado para que se pueda ver lo que digo:
Se les ocurre alguna idea??
de antemano mil gracias!!!!
y Saludos

Código PHP:
<?
session_start
();

include(
'../../files/configuracion.php');//para la consulta mysql
require_once("../../excel/Classes/PHPExcel.php"); //para armar el excel
require_once("../../excel/Classes/PHPExcel/Writer/Excel2007.php");//para armar el excel

        

     //esto es el resultado de un formulario, las variables que uso para armar el excel (rango de edades que convierto en fechas de nacimiento para su busqueda)                
            
$afiliado1=addslashes($_POST['1']);
                
$edad1=$afiliado1;
                
$edad_num1=$edad1;

                
$afiliado2=addslashes($_POST['2']);
                
$edad2=$afiliado2;
                
$edad_num2=$edad2;
                
                
$ano_hoy=date('Y');
                
$mes_hoy=date('m');
                
$dia_hoy=date('d');
            
            
$ano_nac1=$ano_hoy-$edad_num1;
            
$mes_nac1=$mes_hoy;
            
$dia_nac1=$dia_hoy;
            
$edad_num1=$ano_nac1.$mes_nac1.$dia_nac1;

            
$ano_nac2=$ano_hoy-$edad_num2;
            
$mes_nac2=$mes_hoy;
            
$dia_nac2=$dia_hoy;
            
$edad_num2=$ano_nac2.$mes_nac2.$dia_nac2;                
        
        
$rs mysql_query("SELECT * FROM grupo_familiar WHERE fecha_nac_num>=$edad_num2 AND fecha_nac_num<=$edad_num1'") or die(mysql_error());
    if(
mysql_num_rows($rs)>0)
    {

            
                
//armo los encabezados de excel
                //objeto de PHP Excel
                
$objPHPExcel = new PHPExcel();
                
//algunos datos sobre autoría
                
$objPHPExcel->getProperties()->setCreator("misitio.COM");
                
                
            
$objPHPExcel->getActiveSheet()->SetCellValue("A1""Afiliado");
            
$objPHPExcel->getActiveSheet()->SetCellValue("B1""Afiliado");
            
$objPHPExcel->getActiveSheet()->SetCellValue("C1""Afiliado");
            
$objPHPExcel->getActiveSheet()->setCellValue("D1""Afiliado");
            
$objPHPExcel->getActiveSheet()->setCellValue("E1""Afiliado");
            
$objPHPExcel->getActiveSheet()->setCellValue("F1""Afiliado");
            
$objPHPExcel->getActiveSheet()->setCellValue("G1""Afiliado");            

            
//Trabajamos con la hoja activa principal
            
$objPHPExcel->setActiveSheetIndex(0);
            
$orden1=2;
        
//trabajo con los datos de la familia
        
while($pariente mysql_fetch_assoc($rs))
        {

            
$id=$pariente['id'];
            
$fecha_nac=$pariente['fecha_nacimiento'];
            
$nummero=$pariente['numermo_afiliado'];
            
$nombre=$pariente['nombre'];                     
              
$apellido=$pariente['apellido'];                                
            
$parentesco=$pariente['parentesco'];             
            
    

        

            
$error_busqueda_padre=0;

            
//levanto los datos del padre de afiliados
        
$datos_padre mysql_query("SELECT * FROM afiliado WHERE num_afiliado='$numero'") or die(mysql_error());
                if(
mysql_num_rows($datos_padre)>0){
                    
$error_busqueda_padre=1;
                    while(
$padre mysql_fetch_assoc($datos_padre))
                    {
                    
$nombre_padre=$padre['nombre'];
                    
$apellido_padre=$padre['apellido'];
                    
$sector_padre=$padre['sector'];
                    }    
                }
    
    
/// ahora consulto los aportes del padre
    
    
if(mysql_num_rows($datos_padre)==0){$error_busqueda_padre=2;}
        if(
$error_busqueda_padre==1)
        {
        
                    
$datos_aportes mysql_query("SELECT * FROM aportes WHERE numero_afiliado='$numero'") or die(mysql_error());
                            if(
mysql_num_rows($datos_aportes)>0)
                            {
                                while(
$aportes mysql_fetch_assoc($datos_aportes))
                                {

                                
$aporte1603=$aportes['2016_03'];
                                
$aporte1604=$aportes['2016_04'];
                                
$aporte1605=$aportes['2016_05'];
                                
$aporte1606=$aportes['2016_06'];
                                
$numero_doble_afil=$aportes['id_afil_baja_alta'];//// este valor me dice que tiene una baja y alta, para poder consultar los datos viejos
                                

                                
                                
if($numero_doble_afil!=0)
                                    {
                                    
$datos_aportes_doble mysql_query("SELECT * FROM aportes WHERE numero_afiliado='$numero_doble_afil'") or die(mysql_error());
                                    if(
mysql_num_rows($datos_aportes_doble)>0)
                                        {
                                            while(
$aportes_doble mysql_fetch_assoc($datos_aportes_doble))
                                            {
                                            
$aporte16032=$aportes_doble['2016_03'];
                                            
$aporte16042=$aportes_doble['2016_04'];
                                            
$aporte16052=$aportes_doble['2016_05'];
                                            
$aporte16062=$aportes_doble['2016_06'];
                                            }
                                        }
                                    
//aca tambien saco datos de afiliado con el numero anterior
                                    
$datos_padre_viejo mysql_query("SELECT * FROM afiliado WHERE num_afiliado='$numero_doble_afil'") or die(mysql_error());
                                    if(
mysql_num_rows($datos_padre_viejo)>0)
                                        {
                                        while(
$padre_viejo mysql_fetch_assoc($datos_padre_viejo))
                                            {
                                            if(
$padre_viejo['baja']==0){$fecha_baja_padre_viejo="NO";}else{$fecha_baja_padre_viejo="SI";}
                                            }
                                        }
                                    }
                                }
                            }    
                

                            

              
$orden1$orden1+1;
//aca completo el excel con todo lo que consulte, lo recorte para que sea mas legible.
                
$objPHPExcel->getActiveSheet()->SetCellValue("A".$orden1$num_afiliado);
                
$objPHPExcel->getActiveSheet()->setCellValue("B".$orden1$apellido_padre);              
                
$objPHPExcel->getActiveSheet()->setCellValue("C".$orden1$nombre_padre);              
                
$objPHPExcel->getActiveSheet()->setCellValue("E".$orden1$sector_padre);             
                
$objPHPExcel->getActiveSheet()->setCellValue("O".$orden1$aporte1603);    
                
$objPHPExcel->getActiveSheet()->setCellValue("S".$orden1$fecha_afil_padre);
                
$objPHPExcel->getActiveSheet()->setCellValue("t".$orden1$fecha_baja_padre);
                
$objPHPExcel->getActiveSheet()->setCellValue("u".$orden1$numero_doble_afil);
                
$objPHPExcel->getActiveSheet()->setCellValue("v".$orden1$fecha_baja_padre_viejo);
                
$objPHPExcel->getActiveSheet()->setCellValue("w".$orden1$aporte16032);
                
$objPHPExcel->getActiveSheet()->setCellValue("x".$orden1$aporte16042);
                
$objPHPExcel->getActiveSheet()->setCellValue("y".$orden1$aporte16052);
                
$objPHPExcel->getActiveSheet()->setCellValue("z".$orden1$aporte16062);

        }

            }


        
//Titulo del libro y seguridad 
        
$objPHPExcel->getActiveSheet()->setTitle('Busqueda');
        
$objPHPExcel->getSecurity()->setLockWindows(true);
        
$objPHPExcel->getSecurity()->setLockStructure(true);
        
        
        
// Se modifican los encabezados del HTTP para indicar que se envia un archivo de Excel.
        
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
        
header('Content-Disposition: attachment;filename="busqueda.xlsx"');
        
header('Cache-Control: max-age=0');
        
$objWriter PHPExcel_IOFactory::createWriter($objPHPExcel'Excel2007');
        
$objWriter->save('php://output');
        exit;
    
    }
?>

Última edición por binagol; 07/08/2016 a las 20:48 Razón: corregi detalles
  #2 (permalink)  
Antiguo 08/08/2016, 10:43
 
Fecha de Ingreso: octubre-2010
Ubicación: España
Mensajes: 1.007
Antigüedad: 14 años
Puntos: 123
Respuesta: consulta mysql con php en varias tablas y armar excel

La verdad que con tanta consulta y bucle anidado es un poco difícil establecer bien la relación entre tus tablas.

Igualmente algunos de tus bucles son innecesarios y bien se podrian resolver a nivel de mysql con un join.

Por ejemplo primero extraes los datos del grupo familiar y luego los datos del afiliado. Aunque no me queda clara la relación entre Estados tablas.

Luego tambien dos consultas prácticamente iguales a la misma tabla aportes. De verdad es necesario hacer otro bucle para volver a traer los datos que ya habías extraído.


Poner consultas a la base de datos dentro de un bucle siempre es una mala idea y solo debe de usarse en casos puntuales que no puedan ser resueltos de otra forma.

Creo que deberías de aclarar primero las relaciones entre tus tablas
__________________
Unset($vida['malRollo']);
  #3 (permalink)  
Antiguo 08/08/2016, 21:21
 
Fecha de Ingreso: agosto-2008
Ubicación: Buenos Aires
Mensajes: 247
Antigüedad: 16 años, 3 meses
Puntos: 6
Respuesta: consulta mysql con php en varias tablas y armar excel

Entiendo lo que decis, del modo que esta armado, quedo un poco enroscado.
Las tablas se relacionan por el numero de afiliado.

"Afiliado" tiene todos los datos del afiliado

"aportes" tiene el numero de afiliado y los aportes (si tuvo otro numero de afiliado anterior, esta ahi)-- >> esto ultimo lo podria pasas a la tabla afiliado, asi consulto de una sola vez los aportes para los dos numeros de afiliado

"familia", tiene la familia, vinculada al numero de afiliado.

La segunda consulta de aportes, se debe a que, si se cambio el numero de afiliado(cosa que no voy a saber hasta cconsultar los aportes, va a tener aportes tambien con otro numero. por ello se vuelve a repertir la consulta.

tengo que ver si con Join agilizo un par de consultas, y nose si hay alguna otra cosa mas que vean que se pueda hacer para mejorar.

Muchas gracias por la ayuda!!
Saludos

Etiquetas: armar, excel, fecha, mysql, select, sql, tabla, tablas
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 16:23.