Optimize query by reducing subqueries (+ 1 alias per subquery, is it possible?)

1

I would like to reduce the number of queries in my query. As the data is distributed across different tables, I am collecting the necessary information through comparisons with your IDs.

Today my query is this. It is functional , but it should be very costly to perform:

SELECT 
    *, 
    (SELECT trtId FROM sistema_trecho treo WHERE treo.treId = voo.vooOrigemId) as trtIdOrigem, 
    (SELECT trtTitulo FROM sistema_trecho_tipo trt WHERE trt.trtId = trtIdOrigem) as trtTituloOrigem, 
    (SELECT treNome FROM sistema_trecho treo WHERE treo.treId = voo.vooOrigemId) as treNomeOrigem, 
    (SELECT treICAO FROM sistema_trecho treo WHERE treo.treId = voo.vooOrigemId) as treICAOOrigem, 
    (SELECT treIATA FROM sistema_trecho treo WHERE treo.treId = voo.vooOrigemId) as treIATAOrigem, 
    (SELECT trtId FROM sistema_trecho tred WHERE tred.treId = voo.vooDestinoId) as trtIdDestino, 
    (SELECT trtTitulo FROM sistema_trecho_tipo trt WHERE trt.trtId = trtIdDestino) as trtTituloDestino, 
    (SELECT treNome FROM sistema_trecho tred WHERE tred.treId = voo.vooDestinoId) as treNomeDestino, 
    (SELECT treICAO FROM sistema_trecho tred WHERE tred.treId = voo.vooDestinoId) as treICAODestino, 
    (SELECT treIATA FROM sistema_trecho tred WHERE tred.treId = voo.vooDestinoId) as treIATADestino,
    (SELECT cidNome FROM sistema_trecho treo LEFT JOIN sistema_cidade cido ON cido.cidId = treo.cidId WHERE treo.treId = voo.vooOrigemId) as treEnderecoCidadeOrigem,
    (SELECT cidAlias FROM sistema_trecho treo LEFT JOIN sistema_cidade cido ON cido.cidId = treo.cidId WHERE treo.treId = voo.vooOrigemId) as treAliasCidadeOrigem,
    (SELECT estUF FROM sistema_trecho treo LEFT JOIN sistema_cidade cido ON cido.cidId = treo.cidId LEFT JOIN sistema_estado est ON est.estId = cido.estId WHERE treo.treId = voo.vooOrigemId) as treEnderecoEstadoOrigem,
    (SELECT cidNome FROM sistema_trecho tred LEFT JOIN sistema_cidade cidd ON cidd.cidId = tred.cidId WHERE tred.treId = voo.vooDestinoId) as treEnderecoCidadeDestino,
    (SELECT cidAlias FROM sistema_trecho tred LEFT JOIN sistema_cidade cidd ON cidd.cidId = tred.cidId WHERE tred.treId = voo.vooDestinoId) as treAliasCidadeDestino,
    (SELECT estUF FROM sistema_trecho tred LEFT JOIN sistema_cidade cidd ON cidd.cidId = tred.cidId LEFT JOIN sistema_estado est ON est.estId = cidd.estId WHERE tred.treId = voo.vooDestinoId) as treEnderecoEstadoDestino

FROM 
    sistema_voo_operadora vop 
    LEFT JOIN sistema_operadora ope ON vop.opeId = ope.opeId 
    LEFT JOIN sistema_voo voo ON vop.vooId = voo.vooId 
    LEFT JOIN sistema_tipo_voo tiv ON voo.tivId = tiv.tivId 
    LEFT JOIN sistema_aeronave aer ON vop.aerId = aer.aerId 
    LEFT JOIN sistema_tipo_aeronave tia ON aer.tiaId = tia.tiaId

WHERE 
    tiv.tivId = 2 
    AND vooAtivo = 'S' 
    AND vooExcluido = 'N' 
    AND opeAtivo = 'S' 
    AND opeExcluido = 'N' 
    AND vopAtivo = 'S' 
    AND vopExcluido = 'N' 

ORDER BY 
    RAND() 

LIMIT 
    0,4;

I would like at least the initial subqueries to be grouped in some way. I tried the following, but to no avail (returned Syntax Error):

Attempt 01:

SELECT 
    *, 
    (SELECT trtId, treNome, treICAO, treIATA FROM sistema_trecho treo WHERE treo.treId = voo.vooOrigemId) as trtIdOrigem, treNomeOrigem, treICAOOrigem, treIATAOrigem 
    (SELECT trtTitulo FROM sistema_trecho_tipo trt WHERE trt.trtId = trtIdOrigem) as trtTituloOrigem, 
    (SELECT trtId, treNome, treICAO, treIATA FROM sistema_trecho tred WHERE tred.treId = voo.vooDestinoId) as trtIdDestino, treNomeDestino, treICAODestino, treIATADestino
    (SELECT trtTitulo FROM sistema_trecho_tipo trt WHERE trt.trtId = trtIdDestino) as trtTituloDestino, 
    (SELECT cidNome FROM sistema_trecho treo LEFT JOIN sistema_cidade cido ON cido.cidId = treo.cidId WHERE treo.treId = voo.vooOrigemId) as treEnderecoCidadeOrigem,
    (SELECT cidAlias FROM sistema_trecho treo LEFT JOIN sistema_cidade cido ON cido.cidId = treo.cidId WHERE treo.treId = voo.vooOrigemId) as treAliasCidadeOrigem,
    (SELECT estUF FROM sistema_trecho treo LEFT JOIN sistema_cidade cido ON cido.cidId = treo.cidId LEFT JOIN sistema_estado est ON est.estId = cido.estId WHERE treo.treId = voo.vooOrigemId) as treEnderecoEstadoOrigem,
    (SELECT cidNome FROM sistema_trecho tred LEFT JOIN sistema_cidade cidd ON cidd.cidId = tred.cidId WHERE tred.treId = voo.vooDestinoId) as treEnderecoCidadeDestino,
    (SELECT cidAlias FROM sistema_trecho tred LEFT JOIN sistema_cidade cidd ON cidd.cidId = tred.cidId WHERE tred.treId = voo.vooDestinoId) as treAliasCidadeDestino,
    (SELECT estUF FROM sistema_trecho tred LEFT JOIN sistema_cidade cidd ON cidd.cidId = tred.cidId LEFT JOIN sistema_estado est ON est.estId = cidd.estId WHERE tred.treId = voo.vooDestinoId) as treEnderecoEstadoDestino

FROM 
    sistema_voo_operadora vop 
    LEFT JOIN sistema_operadora ope ON vop.opeId = ope.opeId 
    LEFT JOIN sistema_voo voo ON vop.vooId = voo.vooId 
    LEFT JOIN sistema_tipo_voo tiv ON voo.tivId = tiv.tivId 
    LEFT JOIN sistema_aeronave aer ON vop.aerId = aer.aerId 
    LEFT JOIN sistema_tipo_aeronave tia ON aer.tiaId = tia.tiaId

WHERE 
    tiv.tivId = 2 
    AND vooAtivo = 'S' 
    AND vooExcluido = 'N' 
    AND opeAtivo = 'S' 
    AND opeExcluido = 'N' 
    AND vopAtivo = 'S' 
    AND vopExcluido = 'N' 

ORDER BY 
    RAND() 

LIMIT 
    0,4;

Attempt 02:

SELECT 
    *, 
    (SELECT trtId as trtIdOrigem as treNomeOrigem, treNome as treNomeOrigem, treICAO as treICAOOrigem, treIATA as treIATAOrigem FROM sistema_trecho treo WHERE treo.treId = voo.vooOrigemId),
    (SELECT trtId as trtIdDestino, treNome as treNomeDestino, treICAO as treICAODestino, treIATA as treIATADestino FROM sistema_trecho tred WHERE tred.treId = voo.vooDestinoId),
    (SELECT cidNome as treEnderecoCidadeOrigem, cidAlias as treAliasCidadeOrigem, estUF as treEnderecoEstadoOrigem FROM sistema_trecho treo LEFT JOIN sistema_cidade cido ON cido.cidId = treo.cidId LEFT JOIN sistema_estado est ON est.estId = cido.estId WHERE treo.treId = voo.vooOrigemId),
    (SELECT cidNome as treEnderecoCidadeDestino, cidAlias as treAliasCidadeDestino, estUF as treEnderecoEstadoDestino FROM sistema_trecho tred LEFT JOIN sistema_cidade cidd ON cidd.cidId = tred.cidId LEFT JOIN sistema_estado est ON est.estId = cidd.estId WHERE tred.treId = voo.vooDestinoId),
    (SELECT trtTitulo FROM sistema_trecho_tipo trt WHERE trt.trtId = trtIdOrigem) as trtTituloOrigem, 
    (SELECT trtTitulo FROM sistema_trecho_tipo trt WHERE trt.trtId = trtIdDestino) as trtTituloDestino

FROM 
    sistema_voo_operadora vop 
    LEFT JOIN sistema_operadora ope ON vop.opeId = ope.opeId 
    LEFT JOIN sistema_voo voo ON vop.vooId = voo.vooId 
    LEFT JOIN sistema_tipo_voo tiv ON voo.tivId = tiv.tivId 
    LEFT JOIN sistema_aeronave aer ON vop.aerId = aer.aerId 
    LEFT JOIN sistema_tipo_aeronave tia ON aer.tiaId = tia.tiaId

WHERE 
    tiv.tivId = 2 
    AND vooAtivo = 'S' 
    AND vooExcluido = 'N' 
    AND opeAtivo = 'S' 
    AND opeExcluido = 'N' 
    AND vopAtivo = 'S' 
    AND vopExcluido = 'N' 

ORDER BY 
    RAND() 

LIMIT 
    0,4;

Summarizing the joke:

I need to bring 4 records from the operating_vootable (vop) table

Within this, I need to bring the flight data (flight), which are in flight_voo (flight.vooId = vop.vooId)

Within the flight table, I save the start excerpt ID and the destination stretch ID. The original data is in system_trecho (treo for origin, and tred for destination). As I need the city, state and slug of every stretch still in this query, my output was doing subqueries.

Left joins are required to bring in more external information such as carrier information, flight type, aircraft used, and aircraft type.

What I can optimize in this query, would save me some hair.

Ideas?

    
asked by anonymous 06.12.2018 / 19:57

0 answers