Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Wanderson Regis Silva

Seleção de auto relacionamento

Recommended Posts

Opa, seguinte, tenho um modelo de tabelas que se auto-relaciona, mas o relacionamento pode vir de qualquer um dos lados, então eu uso uma tabela de ligação, só que quando eu tento selecionar os dados, acontece com frequência uma multiplicidade dos dados. O modelo é semelhante ao seguinte (removendo campos não usados):

 

CREATE TABLE `usuario` (
 `idusuario` int(11) NOT NULL AUTO_INCREMENT,
 `nome` varchar(45) NOT NULL,
 PRIMARY KEY (`idusuario`)
);

+-----------+---------+
| idusuario | nome    |
+-----------+---------+
|         1 | Ana     |
|         2 | Maria   |
|         3 | Pedro   |
|         4 | Roberta |
|         5 | Carlos  |
|         6 | Camila  |
|         7 | Marcos  |
+-----------+---------+

CREATE TABLE `conhece` (
 `primeiro` int(11) NOT NULL,
 `segundo` int(11) NOT NULL
);

+----------+---------+
| primeiro | segundo |
+----------+---------+
|        2 |       1 |
|        3 |       1 |
|        4 |       1 |
|        5 |       1 |
|        1 |       6 |
|        1 |       7 |
+----------+---------+

O problema é que conforme um usuário aparece mais vezes na tabela 'conhece' alguns relacionamento reaparecem: A seleção que eu faço é a seguinte:

 

SELECT idusuario,nome FROM conhece c INNER JOIN usuario u ON u.idusuario IN(primeiro,segundo);

+-----------+---------+
| idusuario | nome    |
+-----------+---------+
|         1 | Ana     |
|         2 | Maria   |
|         1 | Ana     |
|         3 | Pedro   |
|         1 | Ana     |
|         4 | Roberta |
|         1 | Ana     |
|         5 | Carlos  |
|         1 | Ana     |
|         6 | Camila  |
|         1 | Ana     |
|         7 | Marcos  |
+-----------+---------+

Basta ver como o usuário 'Ana' reaparece diversas vezes. Queria então saber se alguém sabe alguma maneira eficiente de juntar as tabelas evitando esse problema. Usar o distinct funciona mas vai ficando pesado conforme a quantidade vai aumentando.

Compartilhar este post


Link para o post
Compartilhar em outros sites

cara,

o resultado está certo,

acredito que você precise refazer a sua querie, caso o resultado não esteja batendo com o que você precisa,

 

pois sua querie busca o nome do usuário nas duas colunas da tabela conhece (primeiro e segundo)

 

se você verificar verá que a Ana aparece 6 vezes na tabela conhece (2 vezes na coluna primeiro e 4 na couna segundo).

 

se você não quer que os nomes se repitam pode usar o DISTINCT.

Compartilhar este post


Link para o post
Compartilhar em outros sites
select c.primeiro,up.nome,c.segundo,us.nome
from usuario up,usuario us,conhece c
where up.idusuario = c.primeiro
and   us.idusuario = c.primeiro
order by 1,3

Compartilhar este post


Link para o post
Compartilhar em outros sites

select c.primeiro,up.nome,c.segundo,us.nome
from usuario up,usuario us,conhece c
where up.idusuario = c.primeiro
and   us.idusuario = c.primeiro
order by 1,3

 

Isso me retornou o mesmo nome na segunda e quarta coluna.

 

Sobre usar DISTINCT ou GROUP BY, isso não manteria o fato de a tabela 'usuario' ser lida muitas vezes? Ou isso não aconteceria? É que a previsão é que a quantidade de dados cresça bastante, e com isso a operação não ficaria pesada?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso é procurar pelo em Ovo.

O banco de dados é rápida se a consulta estiver específica.

 

Não tem essa de não usar group by ou distinct, vai tornar a consulta lenta.

Isso vai depender da sua modelagem de dados, relacionamentos e outros.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ops ....

 

select c.primeiro,up.nome,c.segundo,us.nome
from usuario up,usuario us,conhece c
where up.idusuario = c.primeiro
and   us.idusuario = c.segundo
order by 1,3

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.