2013-10-05 46 views
2

我需要計算A用戶與其他用戶列表之間的共同朋友(A, B, C, D, E...);MySQL計算多個用戶之間的共同朋友

這是我目前relations表的例子:

INSERT INTO `relations` (`id`, `related_to`, `user_id`) VALUES 
(1, 10, 1), 
(2, 12, 1), 

(3, 10, 2), 

(4, 12, 3), 
(5, 10, 3), 

(6, 10, 4), 

(7, 3, 5), 
(8, 2, 1), 
(9, 1, 3); 

,現在我想算共同的朋友愨用戶1和用戶(2, 3, 4)

所以,我應該得到的結果是用戶2將有一個共同的朋友,用戶3將有兩個共同的朋友,並且用戶4將有一個共同的朋友。

這裏是SQL Fiddle進行測試和選擇語句顯示哪些字段,我應該得到一次正確的查詢寫入。

編輯我想我應該糾正我自己,我不需要來獲取有關用戶的行,我確實需要得到每個用戶ID的計數結果,例如[3] => 2

回答

4

會這項工作?

SELECT r1.user_id AS first_user 
, r2.user_id as second_user 
, COUNT(r1.related_to) as mutual_friend_count 
FROM relations r1 
INNER JOIN relations r2 
ON r1.related_to = r2.related_to AND r1.user_id <> r2.user_id 
GROUP BY r1.user_id, r2.user_id 

我使用related_to柱,由用戶對分組的連接的表到其自身上並計數它們之間

+0

似乎工作的「related_to的數目:HTTP:/ /sqlfiddle.com/#!2/20833/11 – Barmar

+1

是的,它沒有,只有一個問題,這將是緩慢的說100k行? – Linas

+0

如果這兩個字段都被索引,它會非常快。如果他們不是,我仍然會想象它會相對較快,因爲它們都是整數場。你可能不會知道,直到你嘗試它。 – JustinHui

2

嘗試此

SELECT count(s.sum),s.user_id 
from (select count(id) as sum,user_id from relations 
WHERE user_id != 1 and RELATED_TO in (select related_to from relations where user_id = 1) group by RELATED_TO,user_id) as s group by user_id;