Ver Mensaje Individual
  #2 (permalink)  
Antiguo 05/08/2011, 10:21
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: Se puede mejorar esta consulta.

Hola arielenter:

Creo que deberías comenzar por decirnos qué es lo que hace tu consulta, pues son sólo ver el código puede resultar muy difícil descifrarlo. Puedes postear la estructura de tu tabla y pones algunos datos de ejemplo para ver si existe otra alternativa para lograr obtener el mismo resultad.

Por lo que puedo observar sólo consultas una tabla (alquiler) por lo que es posible que se pueda cambiar la consulta para que no tengas que hacer subconsultas. A reserva de que nos expliques la lógica de tu pregunta se me ocurre que puedes hacer algo como esto:

Código MySQL:
Ver original
  1. SUM(IF(fentrada BETWEEN '2001-01-01' AND '2011-08-04'
  2. AND estado='PAGADO' OR estado='OCUPADO', total, 0))
  3. +
  4. SUM(IF(fentrada BETWEEN '2011-01-08' AND '2011-05-08'
  5. AND estado='OCUPADO', entrega, 0))
  6. +
  7. SUM(IF(fentrada BETWEEN '2011-01-08' AND '2011-05-08'
  8.  AND estado='DEBE', entrega, 0)) xTotal
  9. alquiler

No estoy seguro siguiera si esto puede funcionar, es una consulta que lanzo vuelo, pero que no he podido probar.

Sólo tengo que hacer una observación y es con las condiciones de tu primer select, te recuerdo que por jerarquía de operadores el AND se ejecuta primero que el OR, por lo tanto cuando tienes esto:

fentrada BETWEEN '2001-01-01' AND '2011-08-04' AND estado='PAGADO' OR estado='OCUPADO'

en palabras sería "todos los registros en que fentrada esté entre el rango de fechas Y que estado sea PAGADO + que el estado sea OCUPADO, sin importar que la fentrada no esté en el rango de fechas"

Si quieres que las condiciones OR se ejecuten en el mismo orden (es decir que la condición del rango de fechas afecte a ambos estados) deberías escribir tu condición así:

Código:
fentrada BETWEEN '2001-01-01' AND '2011-08-04' 
AND (estado='PAGADO' OR estado='OCUPADO') 
o utilizando el operador IN

Código:
fentrada BETWEEN '2001-01-01' AND '2011-08-04' 
AND estado IN ('PAGADO', 'OCUPADO')
Saludos y espero tus comentarios
Leo