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

[SOLUCIONADO] Optimizar consulta

Estas en el tema de Optimizar consulta en el foro de Mysql en Foros del Web. Me podrían dar su opinión, critica, recomendación acerca de esta consulta @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: Ver original SELECT               ...
  #1 (permalink)  
Antiguo 13/04/2013, 15:41
 
Fecha de Ingreso: febrero-2009
Ubicación: mexico
Mensajes: 148
Antigüedad: 15 años, 2 meses
Puntos: 1
Pregunta Optimizar consulta

Me podrían dar su opinión, critica, recomendación acerca de esta consulta

Código MySQL:
Ver original
  1.                         (SELECT
  2.                             IF(COUNT(cc.ID_CONTRATO)>0,COUNT(cc.ID_CONTRATO),'')
  3.                         FROM
  4.                             contrato cc
  5.                         INNER JOIN especialidad ee ON ee.ID_ESPECIALIDAD = cc.ID_ESPECIALIDAD
  6.                         INNER JOIN departamento dd ON dd.ID_DEPARTAMENTO = ee.ID_DEPARTAMENTO
  7.                         WHERE
  8.                             cc.ID_SITUACION = 18
  9.                         AND
  10.                             cc.ID_TIPO_CONTRATO = '".$this->getId_tipo_contrato()."'
  11.                         AND
  12.                             dd.NOMBRE_CORTO = '".$this->getNombre_corto_departamento()."'
  13.                         ) AS 'EJECUCION',
  14.                         (SELECT
  15.                             IF(COUNT(cc.ID_CONTRATO)>0,COUNT(cc.ID_CONTRATO),'')
  16.                         FROM
  17.                             contrato cc
  18.                         INNER JOIN especialidad ee ON ee.ID_ESPECIALIDAD = cc.ID_ESPECIALIDAD
  19.                         INNER JOIN departamento dd ON dd.ID_DEPARTAMENTO = ee.ID_DEPARTAMENTO
  20.                         WHERE
  21.                             cc.ID_SITUACION = 19
  22.                         AND
  23.                             cc.ID_TIPO_CONTRATO = '".$this->getId_tipo_contrato()."'
  24.                         AND
  25.                             dd.NOMBRE_CORTO = '".$this->getNombre_corto_departamento()."'
  26.                         ) AS 'SUSPENDIDO',
  27.                         (SELECT
  28.                             IF(COUNT(cc.ID_CONTRATO)>0,COUNT(cc.ID_CONTRATO),'')
  29.                         FROM
  30.                             contrato cc
  31.                         INNER JOIN especialidad ee ON ee.ID_ESPECIALIDAD = cc.ID_ESPECIALIDAD
  32.                         INNER JOIN departamento dd ON dd.ID_DEPARTAMENTO = ee.ID_DEPARTAMENTO
  33.                         WHERE
  34.                             cc.ID_SITUACION = 20
  35.                         AND
  36.                             cc.ID_TIPO_CONTRATO = '".$this->getId_tipo_contrato()."'
  37.                         AND
  38.                             dd.NOMBRE_CORTO = '".$this->getNombre_corto_departamento()."'
  39.                         ) AS 'MORA',
  40.                         (SELECT
  41.                             IF(COUNT(cc.ID_CONTRATO)>0,COUNT(cc.ID_CONTRATO),'')
  42.                         FROM
  43.                             contrato cc
  44.                         INNER JOIN especialidad ee ON ee.ID_ESPECIALIDAD = cc.ID_ESPECIALIDAD
  45.                         INNER JOIN departamento dd ON dd.ID_DEPARTAMENTO = ee.ID_DEPARTAMENTO
  46.                         WHERE
  47.                             cc.ID_SITUACION = 39
  48.                         AND
  49.                             cc.ID_TIPO_CONTRATO = '".$this->getId_tipo_contrato()."'
  50.                         AND
  51.                             dd.NOMBRE_CORTO = '".$this->getNombre_corto_departamento()."'
  52.                         ) AS 'FINIQUITO',
  53.                         (SELECT
  54.                             IF(COUNT(cc.ID_CONTRATO)>0,COUNT(cc.ID_CONTRATO),'')
  55.                         FROM
  56.                             contrato cc
  57.                         INNER JOIN especialidad ee ON ee.ID_ESPECIALIDAD = cc.ID_ESPECIALIDAD
  58.                         INNER JOIN departamento dd ON dd.ID_DEPARTAMENTO = ee.ID_DEPARTAMENTO
  59.                         WHERE
  60.                             cc.ID_SITUACION = 46
  61.                         AND
  62.                             cc.ID_TIPO_CONTRATO = '".$this->getId_tipo_contrato()."'
  63.                         AND
  64.                             dd.NOMBRE_CORTO = '".$this->getNombre_corto_departamento()."'
  65.                         ) AS 'PROBLEMA'
  66.                         FROM
  67.                             contrato c
  68.                         INNER JOIN especialidad e ON e.ID_ESPECIALIDAD = c.ID_ESPECIALIDAD
  69.                         INNER JOIN departamento d ON d.ID_DEPARTAMENTO = e.ID_DEPARTAMENTO
  70.                         WHERE
  71.                             d.NOMBRE_CORTO = '".$this->getNombre_corto_departamento()."'

Que devuelte esta consulta, devuelve los tipos de contratos(genéricos y especificos) por departamento, al igual que devuelve la situación de cada contrato (ejecución,mora,problema,suspendido,finiquito).

se aceptan todo tipo de comentarios, yo se que se puede mejorar pero necesito su ayuda para esto, gracias de antemano.

Última edición por gnzsoloyo; 13/04/2013 a las 16:09 Razón: Etiquetdo incorrecto
  #2 (permalink)  
Antiguo 13/04/2013, 16:46
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Optimizar consulta

Considerando que todas las subconsultas llevan los mismos parámetros, con excepción de uno, y ese sólo es el relevante para la cuenta, simplemente contaría ese. Además, me sorprendería que no estuviese devolviendo errores de sintaxis.
Yo lo podria así:
Código MySQL:
Ver original
  1.     IF(E > 0, E, '') EJECUCION,
  2.     IF(S > 0, S, '') SUSPENDIDO,
  3.     IF(M > 0, M, '') MORA,
  4.     IF(P > 0, P, '') PROBLEMA
  5. FROM    
  6.     (SELECT
  7.         COUNT(IF(cc.ID_SITUACION = 18, cc.ID_CONTRATO,0)) E,
  8.         COUNT(IF(cc.ID_SITUACION = 19, cc.ID_CONTRATO,0)) S,
  9.         COUNT(IF(cc.ID_SITUACION = 39, cc.ID_CONTRATO,0)) M,
  10.         COUNT(IF(cc.ID_SITUACION = 46, cc.ID_CONTRATO,0)) P
  11.     FROM
  12.         contrato c
  13.         INNER JOIN especialidad e ON e.ID_ESPECIALIDAD = c.ID_ESPECIALIDAD
  14.         INNER JOIN departamento d ON d.ID_DEPARTAMENTO = e.ID_DEPARTAMENTO
  15.     WHERE
  16.         d.NOMBRE_CORTO = '".$this->getNombre_corto_departamento()."'
  17.         AND c.ID_TIPO_CONTRATO = '".$this->getId_tipo_contrato()."') TABLA;
Por cierto, un sano consejo es jamás pongas subconsultas en el SELECT si puedes evitarlo. Son desastrosas para la performance, porque se ejecutan una vez por cada registro devuelto en la consulta principal, por lo que el resultado en realidad podría estar siendo calamitoso...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 15/04/2013, 08:10
 
Fecha de Ingreso: febrero-2009
Ubicación: mexico
Mensajes: 148
Antigüedad: 15 años, 2 meses
Puntos: 1
Respuesta: Optimizar consulta

Gracias por tu ayuda solo que la consulta me devuelve el mismo resultado en todos if, modifique la consulta y obtuve el resultado que deseaba, quedo asi:

Código:
SELECT
    EJECUCION,
    SUSPENDIDO,
    MORA,
    PROBLEMA
FROM    
    (SELECT
        IF(cc.ID_SITUACION = 18, COUNT(cc.ID_CONTRATO),0) EJECUCION,
        IF(cc.ID_SITUACION = 19, COUNT(cc.ID_CONTRATO),0) SUSPENDIDO,
        IF(cc.ID_SITUACION = 39, COUNT(cc.ID_CONTRATO),0) MORA,
        IF(cc.ID_SITUACION = 46, COUNT(cc.ID_CONTRATO),0) PROBLEMA
    FROM 
        contrato cc
        INNER JOIN especialidad e ON e.ID_ESPECIALIDAD = cc.ID_ESPECIALIDAD
        INNER JOIN departamento d ON d.ID_DEPARTAMENTO = e.ID_DEPARTAMENTO
    WHERE
        d.NOMBRE_CORTO = "MISO"
        AND cc.ID_TIPO_CONTRATO = 1) TABLA;
Gracias por tu ayuda gnzsoloyo.

Etiquetas: procedure
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 04:33.