Ir para conteúdo

POWERED BY:

Arquivado

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

Halan batista

query com relacionamentos

Recommended Posts

Olá.

Tudo bem?

 

Não estou conseguindo executar a seguinte query.

 

Tenho uma tabela chamada "amigos" e nessa tabela possuo

 

id id_usuario id_amigo

1 1 2

 

E tenho uma tabela onde ficam todos os eventos, tabela "eventos"

id id_usuario titulo_evento

 

 

Eu precisava fazer a seguinte query. Preciso pegar todos os usuários que são meus amigos e recuperar todos os eventos meus e dos meus amigos e listar em minha página.

 

Como eu poderia fazer isso de uma forma bem otimizada?

 

Abs,

 

Halan.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma forma ...

 

Supondo id_usuario ser a chave :

 

Preciso pegar todos os usuários que são meus amigos

 

SELECT *
FROM AMIGOS A1,AMIGOS A2
WHERE A1.ID_USUARIO = 1 
AND   A2.ID_AMIGO = A1.ID_USUARIO

 

e recuperar todos os eventos meus e dos meus amigos e listar em minha página.

 

SELECT *
FROM (SELECT A1.ID_USUARIO ID, A2.ID_AMIGO
     FROM AMIGOS A1,AMIGOS A2
     WHERE A1.ID_USUARIO = 1 
     AND   A2.ID_AMIGO = A1.ID_USUARIO) IDS,
    EVENTO E1,EVENTO E2
WHERE E2.ID_USUARIO = IDS.ID
AND   E2.ID_USUARIO = IDS.ID_AMIGO

 

Como eu poderia fazer isso de uma forma bem otimizada?

 

Isto depende das tabelas terem índices, entre outro fatores.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma forma ...

 

Supondo id_usuario ser a chave :

 

 

 

SELECT *
FROM AMIGOS A1,AMIGOS A2
WHERE A1.ID_USUARIO = 1 
AND   A2.ID_AMIGO = A1.ID_USUARIO

 

 

 

SELECT *
FROM (SELECT A1.ID_USUARIO ID, A2.ID_AMIGO
     FROM AMIGOS A1,AMIGOS A2
     WHERE A1.ID_USUARIO = 1 
     AND   A2.ID_AMIGO = A1.ID_USUARIO) IDS,
    EVENTO E1,EVENTO E2
WHERE E2.ID_USUARIO = IDS.ID
AND   E2.ID_USUARIO = IDS.ID_AMIGO

 

 

 

Isto depende das tabelas terem índices, entre outro fatores.

 

 

 

Então... Eu utilizei essa query assim:

 

SELECT * FROM (
SELECT A1.ID_USUARIO ID, A2.ID_AMIGO       
FROM tb_assinar_feed A1,tb_assinar_feed A2       
WHERE A1.ID_USUARIO = 1        
AND   A2.ID_AMIGO = A1.ID_USUARIO) IDS,      
tb_evento E1,tb_evento E2 WHERE E2.ID_USUARIO = IDS.ID AND   
E2.ID_USUARIO = IDS.ID_AMIGO;

 

Só que eu possuo apenas 2 amigos cadastrados na tabela "tb_assinar_feed" e possuo 6 eventos cadastrados na tabela "tb_evento" sendo 2 eventos por usuário, ou seja, 2 eventos meu, 2 de outro amigo e 2 de outro amigo.

 

Era para me retornar apenas 6 registros certo? Ele está retornando 24 registros com essa query.

 

Todas tabelas estão com indíce e relacionamento entre sí.

 

 

Se eu fizer uma query assim:

 

SELECT *

FROM (
      SELECT a.id_usuario, a.id_amigo
        FROM tb_assinar_feed a
      WHERE a.id_usuario = 1
      ) amigos, 

tb_evento e
WHERE e.id_usuario = amigos.id_amigo;

 

Ele me retorna 4 registros que são o dos meus amigos, 2 eventos por amigo. Só que fica faltando os meus eventos dai, que são mais 2.

 

Tentei usar assim:

 

SELECT *

FROM (
      SELECT a.id_usuario, a.id_amigo
        FROM tb_assinar_feed a
      WHERE a.id_usuario = 1
      ) amigos, 

tb_evento e
WHERE e.id_usuario = amigos.id_amigo OR e.id_usuario = 1;

 

Só que dai ele me retorna 8 registros e não 6.

 

 

No aguardo de sugestões,

 

Abs.

Compartilhar este post


Link para o post
Compartilhar em outros sites

De fato vai haver um Produto Cartesiano pois os Eventos diversos serão multiplicados.

 

Talvez a solução seja fazer uma query "meus eventos" e outras "eventos de meus amigos"

 

SELECT * 
FROM tb_assinar_feed A1,tb_evento E1,       
WHERE A1.ID_USUARIO = 1        
AND E1.ID_USUARIO = a1.ID

SELECT * 
FROM (SELECT A1.ID_USUARIO ID, A2.ID_AMIGO       
     FROM tb_assinar_feed A1,tb_assinar_feed A2       
     WHERE A1.ID_USUARIO = 1        
     AND   A2.ID_AMIGO = A1.ID_USUARIO) IDS,      
     tb_evento E2 
WHERE E2.ID_USUARIO = IDS.ID_AMIGO;

Compartilhar este post


Link para o post
Compartilhar em outros sites

De fato vai haver um Produto Cartesiano pois os Eventos diversos serão multiplicados.

 

Talvez a solução seja fazer uma query "meus eventos" e outras "eventos de meus amigos"

 

SELECT * 
FROM tb_assinar_feed A1,tb_evento E1,       
WHERE A1.ID_USUARIO = 1        
AND E1.ID_USUARIO = a1.ID

SELECT * 
FROM (SELECT A1.ID_USUARIO ID, A2.ID_AMIGO       
     FROM tb_assinar_feed A1,tb_assinar_feed A2       
     WHERE A1.ID_USUARIO = 1        
     AND   A2.ID_AMIGO = A1.ID_USUARIO) IDS,      
     tb_evento E2 
WHERE E2.ID_USUARIO = IDS.ID_AMIGO;

 

 

 

 

 

É que eu não queria fazer duas querys.

 

Se eu fizer uma query assim:

 

SELECT *

FROM (
      SELECT a.id_usuario, a.id_amigo
        FROM tb_assinar_feed a
      WHERE a.id_usuario = 1
      ) amigos, 

tb_evento e
WHERE e.id_usuario = amigos.id_amigo;

 

Ele me retorna 4 registros que são o dos meus amigos, 2 eventos por amigo. Só que fica faltando os meus eventos dai, que são mais 2.

 

Tentei usar assim:

 

SELECT *

FROM (
      SELECT a.id_usuario, a.id_amigo
        FROM tb_assinar_feed a
      WHERE a.id_usuario = 1
      ) amigos, 

tb_evento e
WHERE e.id_usuario = amigos.id_amigo OR e.id_usuario = 1;

 

Só que dai ele me retorna 8 registros e não 6.

 

 

No aguardo de sugestões,

Compartilhar este post


Link para o post
Compartilhar em outros sites

select * from eventos where id_usuario = 1
UNION ALL
select * from eventos where id_usuario in (select id_amigo from from amigos where id_usuario = 1)

 

primeira linha seus eventos

terceira linha eventos dos seus amigos

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.