Quais são as maneiras para obter mútuo amigos em um (1, 2) (2, 1) amizade cenário?
-
12-12-2019 - |
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
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";