2015-04-04 2 views
0

У меня сегодня немного мозговой пердит, пытаясь выработать мою логику. Мне нужно подсчитать, сколько друзей человек делится с одним пользователем. (Взаимные друзья)MYSQL - Разработайте и оцените общие друзья

У меня есть таблица с идентификатором пользователя, а также идентификатор пользователя для друга, пример моего макета ниже:

Первого результат означает user1 дружит с пользователем 2

[ID] - [FriendsID] 
1-2 
1-3 
1-4 
1-15 
2-1 
2-4 
3-1 
3-4 
4-1 
4-2 
4-3 
4-15 
5-15 
15-1 
15-5 
15-4 

Когда загружается моя страница PHP, она загрузит список друзей для этого пользователя, например User1. Это вернет «FriendID» из (2,3,4.15)

Я тогда нужно выяснить, как много общих друзей у людей с пользователем: 1 Так, например,

1 is friends with 2,3,4 
2 is friends with 1,4 
3 is friends with 1,4,15 

This would mean that “2” shares ONE mutual friend with 1 
This would mean that “3” shares TWO mutual friend with 1 

и так на

Мой выход должен быть [FriendID] [Count]

друг ID быть другом

граф является ч вл много общих друзей с идентификатором пользователя 1

(пример данных, записанных вручную из)

+0

В вашем примере вы указываете, что Nr. 3 акции ДВА общих друзей с 1, но это не так. Возможно, вы означали «2,4,15» в этой строке. Я только что заметил. – AlexioVay

ответ

1

Вы можете сделать это с помощью автообъединение на friendsid колонке:

select t1.id, t2.id, count(*) as num_mutual_friends 
from table t1 join 
    table t2 
    on t1.friendsid = t2.friendsid and t1.id <> t2.id 
group by t1.id, t2.id; 

Я замечаю, что ваши данные симметрична , поэтому (1, 2) находится в данных, а также (2, 1). Это означает, что эта логика должна работать на вас. Вы можете добавить предложение where, если вам нужен только один идентификатор.