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

Asked

Viewed 25 times

1

I would like to reduce the number of queries in my query. As the data are distributed in different tables, I collect the necessary information through comparisons with their Ids.

Today my consultation is this. She is functional, however, it must be very costly to the performance:

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 queries to be grouped in some way. I tried the following, but without success (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;

Summing up the joke:

I need to bring 4 records of the system_voo_operator table (Vop)

Inside this, I need to bring the flight data (flight), which are in system_flight (flight.vooId = Vop.vooId)

Inside the flight table, I keep the ID of the departure leg and the ID of the destination leg. The original data are in system_excerpt (Treo for origin, and Tred for destination). As I need the city, state and Slug of each stretch still in this query, my exit were to do Subqueries.

The left joins are needed to bring more external elements, such as operator information, flight type, aircraft used and aircraft type.

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

Ideas?

No answers

Browser other questions tagged

You are not signed in. Login or sign up in order to post.