Pergunta

Eu estou desenvolvendo um site em que quando uma pessoa adiciona outra pessoa, como um amigo, 2 entradas são criadas.Vamos dizer que uid 1 adiciona uid 2 como um amigo, as seguintes linhas são criadas no MySQL.

activity_id   uid1 uid2
     1         1     2
     2         2     1

uid 2 tornam-se amigos uid 3:

activity_id   uid1 uid2
     1         1     2
     2         2     1
     3         2     3
     4         3     2

Quais são as formas de obter os amigos em comum entre uid 1 e uid 2?Eu estou usando php e MySQL sem DOP experiência (por agora).

[EDITAR] Ok, então decidi organizar/normalizar as tabelas.A relação gera apenas 1 linha agora.o que torna a tabela:

activity_id   uid1 uid2
     1         1     2
     2         2     3
Foi útil?

Solução

Olhando para o formato de tabela a partir de sua outra pergunta, este deve fazer o que você quer;

SELECT name FROM users u
JOIN friends f1
  ON u.uid = f1.uid OR u.uid = f1.fid
JOIN friends f2
  ON u.uid = f2.uid OR u.uid = f2.fid
WHERE (f1.uid=1 OR f1.fid=1) AND (f2.uid=3 OR f2.fid=3) 
  AND u.uid<>1 AND u.uid<>3;

Demonstração aqui.

Outras dicas

Supondo que você tenha chamado a sua tabela de 'amigos'.

Esta consulta irá encontrar amigos comuns para os usuários 1 e 3.

SELECT a.uid2
  FROM friends a
    INNER JOIN friends b
       ON a.uid2 = b.uid2
  WHERE a.uid1 = 1
   AND b.uid1 = 3

Você não acha que ele pode ser um pouco presunçoso para fazer 2 linhas que?Talvez uid 2 não gosta de uid 1 ?(OTY).

Para encontrar todos os amigos comuns de uid 1 e uid 2:

SELECT t1.uid2
FROM   tbl t1
JOIN   tbl t2 USING (uid2)
WHERE  t1.uid1 = 1
AND    t2.uid1 = 2;

Existe um caso especial, que:esta consulta não mostra se 1 & 2 são amigos!

BTW, o design parece um pouco redundante.Ele deve funcionar com apenas uma entrada por amizade.(Essa consulta teria que ser adaptado para isso, no entanto.)

Basicamente, este é outro caso de relacional divisão.Há muitas maneiras diferentes de pele este gato. Encontrar sob esta questão relacionada com a - incluindo testes de desempenho e obter mais informações.


Consulta atualizado pergunta

Agora há apenas 1 linha por amizade - o usuário pode aparecer em cada coluna:

SELECT uid
FROM (
    SELECT uid2 AS uid FROM tbl WHERE uid1 = 1
    UNION ALL
    SELECT uid1        FROM tbl WHERE uid2 = 1
    ) u1
JOIN (
    SELECT uid2 AS uid FROM tbl WHERE uid1 = 2
    UNION ALL
    SELECT uid1        FROM tbl WHERE uid2 = 2
    ) u2 USING (uid)
$query="SELECT distinct(uid2) FROM `test` where uid1=$uid union select distinct(uid1) from test where uid2=$uid";
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top