Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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.
>
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.
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;>
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,
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
Uma forma ...
Supondo id_usuario ser a chave :
SELECT *
AND E2.ID_USUARIO = IDS.ID_AMIGOFROM AMIGOS A1,AMIGOS A2
WHERE A1.ID_USUARIO = 1
AND A2.ID_AMIGO = A1.ID_USUARIO
Isto depende das tabelas terem índices, entre outro fatores.