suponhamos a seguinte estrutura de tabela em mysql:
tabela_cliente
codigo
nome
descrição
codigo_filho
codigo_filha
como buscar um cliente e seus filhos e netos? sendo que estes tambem sao clientes?
preciso usar join? union? subselect?
sinceramente nao cheguei a um resultado satisfatorio e agradeço qualquer auxilio.
Bom, eu acho que você teria que fazer isso de forma recursiva no seu programa, pois nenhum desses comandos iriam retornar de forma satisfatória o resultado de que você espera.
No caso do codigo_filho e codigo_filha, eles deveriam estar em outra tabela, pois se o sujeito tiver mais de um filho ou filha não será possível tratar.
Ex.
tabela_filiacao
codigo
fk_codigo_origem(pai ou mae)
fk_codigo_cliente(codigo desse cliente que é filho ou filha)
E alterar a tabela_cliente tirando codigo_filho/filha para um fk_codigo_filiacao
Se vc quiser os filhos como linhas então tem que usar “Union” com “SubQuery” mas se vc quiser os filhos como colunas no seu resultado, o que acho mais viavel seguindo o seu modelo, faz assim:
Select cli.*, fio.nome, fia.nome
from tabela_cliente cli
, tabela_cliente fio
, tabela_cliente fia
where cli.codigo = cli.codigo -- "Codigo do seu cliente ou, para todo mundo, basta retirar este join"
and fio.codigo = cli.codigo_filho
and fia.codigo = cli.codigo_filha;
OBS.: Dependendo vc terá que usar AlterJoin pra trazer quem não tem o código do filho ou filha cadastrada pq não tem “(+)” no MySql igual ao Oracle o que acho extremamente util.
Se eu fizer uma tabela auxiliar é possivel trazer os resultados?
quero montar uma espécie de arvore binaria, em que um fulano pode indicar quantos quiser, sendo que abaixo dele vao estar apenas 2 diretos, sendo assim, acabam ‘escorrendo’ para uma das laterais.
os que estao abaixo dele tbm tem o mesmo comportamento.
seria algo como:
…1
…2…3
4…5…6…7
onde na tabela ficaria:
id_user id_user_indicou lateral id_user_abaixo_E id_user_abaixo_D nivel nome
1…0…E…2…3…1…jorge
2…1…E…4…5…2…zezinho
3…1…D…6…7…2…maria
4…1…E…0…0…3…samuel
5…2…D…0…0…3…rafael
6…3…E…0…0…3…gisele
7…3…D…0…0…3…manoela
meu problema esta sendo montar esta arvore a partir de um dos codigos, buscando TODOS abaixo, independente se foram indicados ou nao pelo codigo, desde que esteja abaixo do fulano em questao.
minha pergunta é se consigo buscar esta arvore por um comando sql ou se devo trazer uma quantidade X de resultados e montar via java.
Esse modelo não é recomendado uma vez que um cliente pode realmente ter mais de um filho ou filha. Mas sim, da pra usar segundo regras de negocio ou pq vc quer assim e pronto, arque com as consequências depois.
O que geralmente fazemos é ter uma tabela que relacione um cliente com seus filhos ainda que estes estejam na mesma tabela ( tabela_cliente ).
Bem, na tabela_filho vc tem apenas dois campos que serão a chave primaria desta tabela (composta) e que tbem serão chave estrangeira na tabela_cliente. Imagine a seguinte situação:
tabela_cliente: 1 - Carlos - descrição qualquer
tabela_cliente: 2 - Sergio - descrição qualquer
tabela_cliente: 3 - Paulo - descrição qualquer
tabela_cliente: 4 - Henrique - descrição qualquer
tabela_cliente: 5 - Gustavo - descrição qualquer
Ou seja …Carlos é pai de Sergio, Paulo e Henrique …
Este não é o melhor modelo uma vez que vc pode acabar cadastrando um pai para um filho que ja tenha um pai cadastrado, ou cadastrar um filho sendo pai … tem que tratar ou rever o modelo.
Fazer os joins disso exibe saber sql é claro. Sugiro montar essa estrutura e testar seu sql.