Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

select em relacionamentos one to many

Olá tenho as seguintes tabelas : caso, parte e pessoa. Sendo que um caso pode ter várias partes e uma pessoa pode ser parte em vários casos. Estou com uma certa dificuldade em uma query, não está me retornando os dados como deveria. Tomemos o seguinte exemplo onde eu tenha dois casos:

caso 1/2018 -> partes: Antonio,Pedro,Ricardo. caso 2/20118 -> partes: Raul, Mauro, Jorge

Agora tenho que criar uma consulta de casos por nome da parte, por exemplo quero os casos(com toda a informações) em que o nome da parte seja 'Anton'. Oque eu gostaria é que fosse me retornado 3 linhas pois quero que os casos onde tem a pessoa 'Ant' seja retornado, mas preciso que essea consulta traga esse caso com a informação de todas as partes que o compõe, mas atá retornando apenas uma linha

SELECT c.caso_id,c.data,c.descricao,c.status,pe.nome,pe.cpf_cnpj FROM mediacao_db.caso c  left join mediacao_db.parte p
on c.caso_id = p.caso_id  join mediacao_db.pessoa pe on p.pessoa_id = pe.pessoa_id
and pe.nome like '%Ant%' 

Como fazer para esta consulta retornar as 3 linhas referentes as 3 partes que o caso possui?

6 respostas

Coloca Where no lugar do And, como retorna?

Oi Fernando, retorna a mesma coisa , apenas uma linha

Espera, acho que agora me toquei o que você quer. Tem 1 registro onde contem as 3 partes mas você quer que seja retornado separado pra cada parte? Me explica melhor como está gravando e relacionando as partes, por favor.

Oi Fernando, de forma simplificada as tabelas estão assim:

tabela caso:  caso_id,data,descricao,status
tabela parte: parte_id, caso_id,pessoa_id
tabela pessoa: pessoa_id, nome, cpfCnpj

um caso pode ter várias partes e uma parte tem uma pessoa.

A situação é a seguinte: imagina que tenho uma página na web que exibe os casos de um escritório de advocacia e nessa página eu tenha um filtro para procurar os casos onde pessoa X seja parte.

O usuario digita no filtro o nome da parte que ele deseja buscar e [e exibido na tela todos os casos onde a pessoa X é parte mas também já na visualização do resultado do filtro eu tenho que exibir as outras partes daquele processo. Tenho que trazer o processo e todas as partes onde a pessoa X é parte.

solução!

Até consegui fazer aqui, fiz de duas formas, não sei se são usuais, eficazes ou eficientes, mas pelo menos devolvem o resultado esperado

1 - aqui faço dois joins adicionais, na primeira junção caso->parte->pessoa eu carrego o caso com todas as partes, e na segunda junção caso->parte->pessoa eu aplico o critério de consulta

SELECT c.caso_id,c.data,c.descricao,c.status,pe.nome,pe.cpf_cnpj
 FROM mediacao_db.caso c 
 left join mediacao_db.parte p on c.caso_id = p.caso_id 
 join mediacao_db.pessoa pe on p.pessoa_id = pe.pessoa_id
 left join mediacao_db.parte p0 on c.caso_id = p0.caso_id 
  join mediacao_db.pessoa pe0 on p0.pessoa_id = pe0.pessoa_id
where pe0.nome like '%Ricar%'

2 - aqui eu utilizei uma subquerie

SELECT c.caso_id,c.data,c.descricao,c.status,pe.nome,pe.cpf_cnpj FROM mediacao_db.caso c 
  join mediacao_db.parte p on c.caso_id = p.caso_id 
  join mediacao_db.pessoa pe on p.pessoa_id = pe.pessoa_id where c.caso_id in(
 select c.caso_id from mediacao_db.caso c 
  join mediacao_db.parte p on c.caso_id = p.caso_id 
  join mediacao_db.pessoa pe on p.pessoa_id = pe.pessoa_id where pe.nome like '%Ric%'
 )

Ricardo, apesar de você ter conseguido, eu entendi que as tabelas partes e caso se relacionam diretamente, nesse caso seria um relacionamento n:n certo? Nesse caso o ideal seria criar uma tabela intermediária, talvez até facilite pra você e simplifique seus selects.