Se o seu relacionamento de amizade for simétrico, você pode armazenar cada par em um registro separado:
friend1 friend2
A B
B A
A C
B D
C B
D B
e consulte todos os
B
amigos de assim:SELECT friend2
FROM friends
WHERE friend1 = 'B'
ou armazene o usuário com o menor
id
no primeiro campo e aquele com o maior id
na segunda:friend1 friend2
A B
A C
B D
e consulte
B
amigos de assim:SELECT friend1
FROM friends
WHERE friend2 = 'B'
UNION ALL
SELECT friend2
FROM friends
WHERE friend1 = 'B'
A primeira opção é um pouco mais eficiente em
MySQL
, e esta é a única opção se sua relação de amizade não for simétrica (como em LiveJournal
) Veja este artigo: