Ver Mensaje Individual
  #9 (permalink)  
Antiguo 13/12/2012, 11:21
alyciashape
 
Fecha de Ingreso: abril-2012
Mensajes: 590
Antigüedad: 12 años, 7 meses
Puntos: 58
Respuesta: Optimización de consultas

Un ejemplo:
Código MySQL:
Ver original
  1. SELECT subctas38.clasct, subctas38.numero, subctas38.titulo, SUM(diario38.debe) AS 'debe', SUM(diario38.haber) AS 'haber'
  2.     FROM subctas38, diario38 WHERE subctas38.clasct = diario38.clasct AND year(diario38.fecha)=2012 AND diario38.fecha <= DATE(2012, 11, 30) AND numero >=430000000 AND numero<440000000
  3.     GROUP BY subctas38.titulo;
  4.  
  5. //Efectos totales
  6. SELECT SUM(importe) AS 'Importe' FROM efectos, clientes
  7. WHERE efectos.clacli=clientes.clacli AND clientes.nctacon=$cuenta_cliente            
  8.             AND libram <= DATE(2012, 11, 30) AND claemp=2;
  9.  
  10. //Efectos devueltos
  11. SELECT SUM(importe) AS 'Importe' FROM efectos, clientes
  12. WHERE efectos.clacli=clientes.clacli AND clientes.nctacon=$cuenta_cliente            
  13.             AND libram <= DATE(2012, 11, 30) AND claemp=2 AND devuelto=1;
  14.  
  15. //Efectos pendientes
  16. SELECT SUM(importe) AS 'Importe' FROM efectos, clientes
  17. WHERE efectos.clacli=clientes.clacli AND clientes.nctacon=$cuenta_cliente            
  18.             AND libram <= DATE(2012, 11, 30) AND claemp=2 AND resuelto=0;
  19.  
  20. //Efectos posteriores
  21. SELECT SUM(importe) AS 'Importe' FROM efectos, clientes
  22. WHERE efectos.clacli=clientes.clacli AND clientes.nctacon=$cuenta_cliente            
  23.             AND libram > DATE(2012, 11, 30) AND claemp=2 AND resuelto=1;
  24.  
  25. //Total
Meto los datos en un array que finalmente se mostrarán en el CSV

Tarda unos 10 minutos. Al final del script tengo todos los datos en $resultado y los imprimo en un CSV con una clase que tengo.

Funciona así. Con la primera consulta saco el nombre, cuenta y algunos datos que necesito de los clientes, así como el haber y el debe total del año hasta el mes que le indico.

Luego para cada cliente tengo que sacar diferentes cantidades de los efectos, vienen de otra base de datos y es para comparar la contabilidad con el programa de gestión y ver si coinciden los datos.

Claro, por cada usuario tiene que sacar mogollón de información. Además los efectos me pidieron que sean desde "siempre", en este caso 2008 que es desde cuando existe la empresa, hasta el mes que le digan.

Si se te ocurre alguna forma de optimizarlo bienvenida sea.

Además tenemos 3 empresas o nombres comerciales y tengo que hacer eso por triplicado, pero ya ni me planteo sacar todos los datos juntos. Los saco de una en una eligiendo en otra ventana con un select la empresa que te interese, la fecha, etc.

Recuerda que es un ODBC que va con DBase y no soporta muchas opciones de BD modernas.

No se si es que no se lo suficiente o es lo que hay y no puedo sacar los datos de forma más eficiente.

PD: Si vas a sugerir subconsultas que sepas que no las soporta en la parte SELECT, solo en la parte WHERE puedo realizar subconsultas.

Última edición por gnzsoloyo; 14/12/2012 a las 04:21 Razón: Corrección de etiquetado.