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

reemplazo de consulta

Estas en el tema de reemplazo de consulta en el foro de Mysql en Foros del Web. Hola a todos. Tengo una consulta al foro a ver si alguien con mas experiencia que yo me puede sacar de esta duda. Tengo una ...
  #1 (permalink)  
Antiguo 15/06/2008, 09:36
Avatar de Ragher  
Fecha de Ingreso: octubre-2004
Ubicación: Rosario, Argentina
Mensajes: 81
Antigüedad: 19 años, 5 meses
Puntos: 0
reemplazo de consulta

Hola a todos. Tengo una consulta al foro a ver si alguien con mas experiencia que yo me puede sacar de esta duda. Tengo una consulta en mysql que me anda bastante lento por la cantidad de inner join que tiene y quisiera saber si hay otra forma de hacer lo que quiero.

Tengo 2 tablas.

tabla 1: tab_estados
Tab_Estados_Id int
Tab_Estados_Valor int
Tab_Estados_Imagen longblob


Tabla 2: tab_abonos
Tab_Abonos_Id int
Tab_Abonos_Propiedad int
Tab_Abonos_Precio_Alquiler decimal
Tab_Abonos_Ene int
Tab_Abonos_Feb int
Tab_Abonos_Mar int
Tab_Abonos_Abr int

...y asi para todos los meses

Lo que hago en mi consulta es mostrar una imagen verde que obtengo de la tabla tab_estados si el valor de Tab_Abonos_Ene es 1 y muestro una roja si el valor de Tab_Abonos_Ene es 0

Esta es la consulta

SELECT


Tab_Abonos_Id,
Tab_Abonos_Propiedad_nombre,
Tab_Abonos_Precio_Alquiler,
Ene.Tab_Estados_Imagen as var_Ene,
Feb.Tab_Estados_Imagen as var_Feb,
Mar.Tab_Estados_Imagen as var_Mar,
Abr.Tab_Estados_Imagen as var_Abr


FROM tab_abonos

inner join tab_propiedades on
tab_propiedades.tab_propiedad_id=tab_abonos.Tab_Ab onos_Propiedad


inner Join tab_estados as Ene on
Ene.Tab_Estados_Valor =tab_abonos.Tab_Abonos_Ene

inner Join tab_estados as Feb on
Feb.Tab_Estados_Valor =Tab_Abonos.Tab_Abonos_Feb

inner Join tab_estados as Mar on
Mar.Tab_Estados_Valor =Tab_Abonos.Tab_Abonos_Mar

inner Join tab_estados as Abr on
Abr.Tab_Estados_Valor =Tab_Abonos.Tab_Abonos_Abr

la consulta me funciona pero es bastante lenta debido que hay 12 inner joins. Hay aluna otra alternativa ?????
__________________
Pronexo.com Diseño web Rosario, San Lorenzo, Argentina
  #2 (permalink)  
Antiguo 16/06/2008, 11:44
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: reemplazo de consulta

No se con que lenguaje muestras la imagen, pero yo me olvidaria de la tabla1 y usaria directamente el hecho de que el campo de cada mes es 1 o 0 para mostrar una u otra imagen. Un simple if en el lenguaje de programació que uses puede mostrar la imagen roja o verde en función del valor sin que este guardada en la bbdd.

Luego una simple consulta

Código:
SELECT Propiedad, 
          Precio_Alquiler, 
          Ene, 
          Feb, 
          Mar,
          Abr,
          ... 
   from tab_abonos;
si guardas todos los cobros en el mismo registro o
si tus registros son así (un abono por registro)

Id_Propiedad___Precio_Alquiler_____Ene__Feb__Mar__ Abr...
1_____1________250________________1____0____0___0
2_____1________250________________0____1____0___0
3_____1________250________________0____0____1___0
4_____1________250________________0____0____0___0
...

luego usa

Código:
Select Propiedad, 
          Precio_Alquiler, 
          max(Ene), 
          max(Feb), 
          max(Mar),
          max(Abr),
          ...
FROM tab_abonos
GROUP BY Propiedad, Precio_Alquiler;
y en ambos casos te dará

_Propiedad___Precio_Alquiler_____Ene__Feb__Mar__Ab r...
_____1________250______________1____1____1___0

leyendo este registro se puede mostrar verde o rojo en función de si es 1 o 0:

Quim


Pero incluso me plantearia redisenyar la bbdd:

Tabla 1:tab_propiedades
tab_propiedades.idPropiedad int (PK)
tab_propiedades.Precio_Alquiler decimal

Tabla 2: tab_abonos
tab_abonos.idAbono Int (PK)
tab_abonos.idPropiedad int (FK tab_propiedades.idPropiedad)
tab_abonos.fecha date
tab_abonos.anno_abono int
tab_abonos.mes_abono int (1,2,...,12)
tab_abonos.importe_abono decimal

Con esta estructura podrias controlar pagos parciales y saber cuando han pagado cada mes.

Código:
SELECT tab_propiedades.idPropiedad,
             tab_propiedades.Precio_Alquiler,
             abonos.anno_abono,
             abonos.mes_abono,
             abonos.importe,
             if(tab_propiedades.Precio_Alquiler = abonos.importe,1,
                    if(abonos.importe<>0,2,0)) //No estoy seguro
                                                //de la sintaxis del if
FROM tab_propiedades 
      INNER JOIN
        (SELECT tab_abonos.idPropiedad,
             tab_abonos.anno_abono,
             tab_abonos.mes_abono,
             sum(tab_abonos.importe_abono) as importe
         FROM tab_abonos
         GROUP BY tab_abonos.idPropiedad,
             tab_abonos.anno_abono,
             tab_abonos.mes_abono) as abonos //sumamos abonos parciales
       ON tab_propiedades.idPropiedad=abonos.idPropiedad
ORDER BY tab_propiedades.idPropiedad,
             tab_propiedades.Precio_Alquiler,
             abonos.anno_abono,
             abonos.mes_abono;
resultado

idPropiedad__Precio_Alquiler__anno_abono__mes_abon o__importe__Abonado
____1_________250__________2008_________1________2 50______1
____1_________250__________2008_________2________2 50______1
....

Abonado 0=Pendiente de pago, 1=Pagado, 2=Pago parcial

Que con un poco de programación podrà generar el mismo output pero con una bbdd mucho mas simple, con mas informació y ocupando menos espacio...



Última edición por quimfv; 17/06/2008 a las 07:09
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 21:24.