Consulta campo codigo na mesma tabela

Bom dia Sres,

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

No Oracle é extramente fácil de fazer isso. Em mySQL não tem pronto mas podes investigar por aqui.

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.

Assim … no seu modelo original vc tem a seguinte estrututa:

Nome Tabela: tabela_cliente

  • codigo (Chave Primaria)
  • nome
  • descrição
  • codigo_filho (chave estrangeira - tabela_cliente (Codigo)
  • codigo_filha (chave estrangeira - tabela_cliente (Codigo)

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 ).

Então ficaria assim:

Nome Tabela: tabela_cliente

  • codigo (Chave Primaria)
  • nome
  • descrição

tabela_filho
codigo_pai (tabela_cliente - codigo) ( Chave primaria )
codigo_filho (tabela_cliente - codigo) ( Chave primaria )

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

tabela_filho: 1 - 2
tabela_filho: 1 - 3
tabela_filho: 1 - 4

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.