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

Consulta sobre funciones en MySQL

Estas en el tema de Consulta sobre funciones en MySQL en el foro de Mysql en Foros del Web. Estimados, estoy trabajando con funciones y procediminentos en MySQL y me gustaria saber por favor si es que existe alguna forma de optimizar este SQL ...
  #1 (permalink)  
Antiguo 31/05/2011, 14:09
 
Fecha de Ingreso: enero-2005
Ubicación: Salta - Argentina
Mensajes: 322
Antigüedad: 19 años, 10 meses
Puntos: 7
Consulta sobre funciones en MySQL

Estimados, estoy trabajando con funciones y procediminentos en MySQL y me gustaria saber por favor si es que existe alguna forma de optimizar este SQL que arme...


Código PHP:

CREATE DEFINER
=`root`@`localhostPROCEDURE `Proc_usuarios_lista`(tipoSaldo int(11))
BEGIN

CASE tipoSaldo

WHEN 1 THEN
        SELECT
          yms_usuarios
.idusuario as id,
          
yms_usuarios.Nombre,
          
yms_usuarios.cuit,  
          
yms_usuarios.provincia,
          (if(
SUM(yms_ccusuarios.haber)<>0,SUM(yms_ccusuarios.haber),0))-(if(SUM(yms_ccusuarios.debe)<>0,SUM(yms_ccusuarios.debe),0)) as saldo
        FROM
          yms_usuarios
          LEFT JOIN 
`yms_ccusuarios`  ON (`yms_usuarios`.idusuario = `yms_ccusuarios`.idusuario)  
        
        
GROUP by yms_usuarios.idusuario

        ORDER BY
          yms_usuarios
.idusuario asc;


WHEN 2 THEN
        SELECT
          yms_usuarios
.idusuario as id,
          
yms_usuarios.Nombre,
          
yms_usuarios.cuit,  
          
yms_usuarios.provincia,
          (if(
SUM(yms_ccusuarios.haber)<>0,SUM(yms_ccusuarios.haber),0))-(if(SUM(yms_ccusuarios.debe)<>0,SUM(yms_ccusuarios.debe),0)) as saldo
        FROM
          yms_usuarios
          LEFT JOIN 
`yms_ccusuarios`  ON (`yms_usuarios`.idusuario = `yms_ccusuarios`.idusuario)  
        
        
GROUP by yms_usuarios.idusuario

        having saldo
>0

        ORDER BY
          yms_usuarios
.idusuario asc;


WHEN 3 THEN
        SELECT
          yms_usuarios
.idusuario as id,
          
yms_usuarios.Nombre,
          
yms_usuarios.cuit,  
          
yms_usuarios.provincia,
          (if(
SUM(yms_ccusuarios.haber)<>0,SUM(yms_ccusuarios.haber),0))-(if(SUM(yms_ccusuarios.debe)<>0,SUM(yms_ccusuarios.debe),0)) as saldo
        FROM
          yms_usuarios
          LEFT JOIN 
`yms_ccusuarios`  ON (`yms_usuarios`.idusuario = `yms_ccusuarios`.idusuario)  
        
        
GROUP by yms_usuarios.idusuario

        having saldo
<0

        ORDER BY
          yms_usuarios
.idusuario asc;          


WHEN 4 THEN
        SELECT
          yms_usuarios
.idusuario as id,
          
yms_usuarios.Nombre,
          
yms_usuarios.cuit,  
          
yms_usuarios.provincia,
          (if(
SUM(yms_ccusuarios.haber)<>0,SUM(yms_ccusuarios.haber),0))-(if(SUM(yms_ccusuarios.debe)<>0,SUM(yms_ccusuarios.debe),0)) as saldo
        FROM
          yms_usuarios
          LEFT JOIN 
`yms_ccusuarios`  ON (`yms_usuarios`.idusuario = `yms_ccusuarios`.idusuario)  
        
        
GROUP by yms_usuarios.idusuario

        having saldo
=0

        ORDER BY
          yms_usuarios
.idusuario asc;          

END CASE;
END


Mi duda esta (como se puede observar) que tengo el MISMO codigo repetido para cambiar solo la condicion que esta en having saldo=0


La pregunta es: Existe alguna forma de "optimizar esto" para de esa forma no tener que colocar el codigo tantas veces repetidas.?

Aguardo sus comentarios por favor.
  #2 (permalink)  
Antiguo 31/05/2011, 21:34
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Consulta sobre funciones en MySQL

Yo lo simplificaría así:
Código MySQL:
Ver original
  1. DELIMITER $$
  2.  
  3. DROP PROCEDURE IF EXISTS `Proc_usuarios_lista`$$
  4. CREATE PROCEDURE `Proc_usuarios_lista`(IN tipoSaldo INT(11))
  5.     id,
  6.     nombre,
  7.     cuit,
  8.     provincia,
  9.     (debe - haber) saldo
  10.   FROM
  11.     (SELECT
  12.           y.idusuario id,
  13.           y.Nombre,
  14.           y.cuit,
  15.           y.provincia,
  16.           SUM(IFNULL(c.haber, 0)) haber,
  17.           SUM(IFNULL(c.debe, 0)) debe
  18.         FROM
  19.           yms_usuarios y LEFT JOIN `yms_ccusuarios` c ON y.idusuario = c.idusuario
  20.         GROUP by y.idusuario
  21.         ORDER BY
  22.           y.idusuario ASC) T1;
  23.  
  24.   CASE tipoSaldo
  25.     WHEN 1 THEN
  26.         SELECT * FROM REPORTE;
  27.     WHEN 2 THEN
  28.         SELECT*
  29.         FROM REPORTE
  30.         HAVING saldo>0;
  31.     WHEN 3 THEN
  32.         SELECT*
  33.         FROM REPORTE
  34.         HAVING saldo<0;
  35.     WHEN 4 THEN
  36.         SELECT*
  37.         FROM REPORTE
  38.         HAVING saldo=0;
  39.     END CASE;
  40. END$$
  41.  
  42. DELIMITER;

Nota: Las tablas TEMPORARY existen sólo mientras dura la conexión, y son visibles sólo para el usuario que abrió la conexión, por lo que el mismo nombre puede ser invocado por diferentes conexiones (incluso usando el mismo usuario) sin que se generen conflictos. cuando la conexión se cierra, la tabla desaparece.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: function, procedure, sql
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 22:29.