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?