9
respostas

pegar 2 tabela em um select

Opa so novo em sql, galera vou dar um problema que estou tendo, Tenho uma tabela de cidade e uma de estado. E quero fazer um select que busca todas cidade tabelas e meus estados também porem, quando faço da seguinte forma, a e lembrando quero que me retorna ordenado pela cidade.

select * from cidade as c inner join estado as e on order by c.nome;

Desse jeito o mysql reclama falando do order by, mais quando coloco desse jeito

select * from cidade as c inner join estado as e on c.codigo = e.codigo order by c.nome;

Aqui roda tudo certo, porem só busca as 27 primeiras cidades porque tenho 27 estado e está comprando o codigo. E por ultimo fiz uma mistura de jpql e sql e deu uma bagunça kkkk.

select * from Cidade, Estado order by cidade.nome;

aqui virou bagunça porque está trazendo todas as minhas cidades, mais está trazendo repetindo cada cidade 27 veses kkkk. Então queria fazer um select que busca minha cidade e meu estado com order pela cidade. Seria algo assim né?

select * from cidade as c inner join estado as e on order by c.nome;

Mais o mysql reclama do order by. :( E SÓ para avisar na minha tabela cidade tenho a minha fk de estado

9 respostas

Oi Alisson, tudo bem? Acho que seu problema com a query é a questão do ON, ele espera uma cláusula condicional. Já estou sem o ON? Se funcionar o problema vai ser os nomes de estados repetidos, ai nesse caso você vai precisar usar um GROUP BY. Pegou a ideia?

Mais o on não seria para a junção das tabelas? e seria por causa da variavel codigo? Sera? porque eu dei apelido para elas, então o acho que sabem diferenciar pelo apelido ou não?

O ON é a clausula, Tipo c.estado = e.sigla, ou c.estato != NULL. Mas você não está usando ela pra nada. O Join já junta as tabelas, mas no ON você precisa passar a condição como exemplifiquei acima.

Tendi mano!! e eu fiz sem o on e me retorno as cidades todas repetidas porque sera? será que é a situação que você me falo de codigos atributos iguais na minha tabela cidade e estado?

Sim, se houver informações repetidas, elas vão se repetir mesmo por que você está usando o select *. Porém, outras coisas podem se repetir por causa do próprio join ao relacionar algumas colunas.

Por exemplo, para cada cidade, ele vai repetir o estado, para solucionar essa repetição causada pela própria queria, você precisa usar o GROUP BY

Supondo que as suas tabelas tenham a seguinte estrutura:

tabela estados

id_estado
nome_estado
sigla_estado


Tabela cidades

id_cidade
id_estado
nome_cidade

Você pode resolver o problema desta forma:

select E.id_estado, E.nome_estado, E.sigla_estado, C.id_cidade, C.nome_cidade  from estados as E inner join cidades as C on E.id_estado = C.id_estado ORDER BY C.nome_cidade

Se a resposta do Daniel Bins não resolver seu problema, posta aqui a estrutura das suas tabelas, ou seja, o nome delas e seus campos, assim como no exemplo do Daniel.

Opa então eu tava meio que usando a jpql que tava tão acostumado com java kkkk. o certo o select era assim

Select * from Cidade as c join Estado as e on c.estado_codigo =  e.codigo;

Esse seu SELECT vai trazer todos os registros da tabela Cidade e da tabela Estado, onde a coluna estado_codigo da tabela contenha um valor que de fato exista na coluna codigo da tabela estado. Como deve ser FK não nula, todos os registros virão.

Se quiser só as cidades, pode colocar SELECT Cidade.* FROM..., ou dar um apelido pra tabela e usar ele:

SELECT c.* FROM Cidade c JOIN...

Era isso de fato que você queria? Tudo certo? Se sim, marque sua própria resposta como solucionadora, ou a que mais te ajudou.