MySQL Query para encontrar amigos e número de amigos em comum
Examinei as perguntas, mas não consigo encontrar nada que faça exatamente o que eu preciso e não consigo descobrir como fazer isso sozinho.
Eu tenho 2 tabelas, uma tabela de usuários e uma tabela de links de amigos. A tabela de usuários é uma tabela de todos os meus usuários:
+---------+------------+---------+---------------+
| user_id | first_name | surname | email |
+---------+------------+---------+---------------+
1 joe bloggs [email protected]
2 bill bloggs [email protected]
3 john bloggs [email protected]
4 karl bloggs [email protected]
Minha tabela de links de amigos mostra todos os relacionamentos entre os usuários, por exemplo:
+--------=+---------+-----------+--------+
| link_id | user_id | friend_id | status |
+---------+---------+-----------+--------+
1 1 3 a
2 3 1 a
3 4 3 a
4 3 4 a
5 2 3 a
6 3 2 a
Como nota, o a na coluna de status significa aprovado, também pode haver r (request) e d (declinado).
O que eu quero fazer é ter uma consulta onde, se um usuário fizer uma pesquisa, ele trará de volta uma lista de usuários com os quais eles não são amigos no momento e quantos amigos em comum cada usuário tem com eles.
Consegui obter uma consulta para todos os usuários que atualmente não são amigos deles. Então, se o usuário que fez a pesquisa tiver o ID do usuário 1:
SELECT u.user_id,u.first_name,u.surname
FROM users u
LEFT JOIN friend_links fl
ON u.user_id = fl.user_id AND 1 IN (fl.friend_id)
WHERE fl.friend_id IS NULL
AND u.user_id != 1
AND surname LIKE 'bloggs'
Como faço para contar o número de amigos em comum para cada usuário retornado?
EDITAR:
Apenas como uma edição como eu não acho que estou sendo particularmente claro com a minha pergunta.
A consulta que tenho atualmente acima produzirá o seguinte conjunto de resultados:
+---------+------------+---------+
| user_id | first_name | surname |
+---------+------------+---------+
2 bill bloggs
4 karl bloggs
Esses são os usuários que combinam o sobrenome bloggs que atualmente não são amigos do joe bloggs (id do usuário 1).
Então, quero ter quantos amigos em comum cada um desses usuários tem com o usuário fazendo a pesquisa, para que os resultados retornados sejam semelhantes:
+---------+------------+---------+--------+
| user_id | first_name | surname | mutual |
+---------+------------+---------+--------+
2 bill bloggs 1
4 karl bloggs 1
Cada um desses usuários retornados tem 1 amigo em comum, já que joe bloggs (id do usuário 1) é amigo de john bloggs e john bloggs é amigo de ambos os usuários retornados.
Espero que isso seja um pouco mais claro.
Obrigado.