Francamente, Pelirr, pocas veces he visto una consulta escrita de una forma más ineficiente, enredada, y con tanto desperdicio de recursos.
Me llevó casi media hora limpiarle todo lo que tiene de más, y no me puse a analizar completamente la lógica de algunas partes, que estimo son completamente inútiles, pero luego de simplificarla quedó así:
Código MySQL:
Ver original IFNULL(SC.idArrival
, NULL, SC.idArrival
) idArrival
, IFNULL(SC.idDeparture
, NULL, SC.idDeparture
) idDeparture
, IFNULL(SC.estadoL
, 'IBK', SC.estadoL
) estadoL
, IFNULL(SC.estadoS
, 'OBK', SC.estadoL
) estadoS
, IFNULL(SC.aeronave
, '- -', SC.aeronave
) aeronave
, IFNULL(SC.matricula
, '- -', SC.matricula
) matricula
, IFNULL(SC.aeropuertoL
, '- -', SC.aeropuertoL
) aeropuertoL
, IFNULL(SC.companiaL
, '- -', SC.companiaL
) companiaL
, IFNULL(SC.numVueloL
, '- -', SC.numVueloL
) numVueloL
, IFNULL(SC.aeropuertoS
, '- -', SC.aeropuertoS
) aeropuertoS
, IFNULL(SC.companiaS
, '- -', SC.companiaS
) companiaS
, IFNULL(SC.numVueloS
, '- -', SC.numVueloS
) numVueloS
, IFNULL(SC.airbridgeUse
, 'NO', if (SC.airbridgeUse
='- -', '- -', 'SI')) airbridgeUse
a.idArrivalFlight idArrival,
a.idDepartureFlight idDeparture,
a.statusCode estadoL,
d.statusCode estadoS,
ac.iataAircraft aeronave,
a.tailNumber matricula,
a.estimatedTime inBlockTime,
a.originAirport aeropuertoL,
a.iataCompanyCode companiaL,
a.flightNumber numVueloL,
pm.pax paxL,
d.estimatedTime offBlockTime,
d.iataAirportCode aeropuertoS,
d.iataCompanyCode companiaS,
d.flightNumber numVueloS,
d.idDepartureFlight paxS,
fs.idFingerService airbridgeUse
INNER JOIN `departureflight` d
ON a.idDepartureFlight
= d.idDepartureFlight
INNER JOIN `aircraft` ac
ON a.tailNumber
= ac.tailNumber
INNER JOIN `subtypeiataaircraft` stc
ON ac.subtypeIataCode
= ac.idSubtypeIata
a.estimatedTime
BETWEEN '2012-10-16 00:00:00' AND '2012-10-16 23:59:59' a.idArrivalFlight idArrival,
e.idDepartureFlight idDeparture,
a.statusCode estadoL,
e.statusCode estadoS,
c.iataAircraft aeronave,
e.tailNumber matricula,
a.estimatedTime inBlockTime,
a.originAirport aeropuertoL,
a.iataCompanyCode companiaL,
a.flightNumber numVueloL,
c.pax paxL,
e.estimatedTime offBlockTime,
e.iataAirportCode aeropuertoS,
e.iataCompanyCode companiaS,
e.flightNumber numVueloS,
d.pax paxS,
'- -' airbridgeUse
INNER JOIN `arrivalflight` a
ON e.idDepartureFlight
= a.idDepartureFlight
INNER JOIN `subtypeiataaircraft` c
ON b.subtypeIataCode
= c.idSubtypeIata
INNER JOIN `paxmerchandisepost` d
ON a.idArrivalFlight
= d.idArrivalFlight
(a.estimatedTime
BETWEEN '2012-10-16 00:00:00' AND '2012-10-16 23:59:59') AND (e.estimatedTime
BETWEEN '2012-10-16 00:00:00' AND '2012-10-16 23:59:59') ) SC2;
- Eliminé todos los AS, que son completamente innecesarios.
- Cambié el enorme IF de los campos por el más eficiente ISNULL(), que cubre casi toda la necesidad.
- Eliminé esas subconsultas sobre el SELECT, que generan un enorme despedicio de recursos (un subselect de ese tipo se ejecuta
una vez por cada registro devuelto, y tu los estás poniendo
en la mayoría de los campos... haz la cuenta del costo).
- Simplifiqué las subconsultas en los INNER JOIN que de todos modos son lo que en realida estarías haciendo, pero más eficiente.
No puedo probarlo, porque no tengo los datos para hacerlo, pero en esencia ese sería el modo de hacerlo.
El refinamiento de la consulta te lo dejo a ti.