[英]Mutual friends- SQL Algorithm
我想要找到共同的朋友。
我有一個像這樣結構的表:
`friends` (
`inviter` int(11) NOT NULL,
`accepter` int(11) NOT NULL,
`time` datetime NOT NULL,)
ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_turkish_ci;
我的load_my_friends(##MY ID##);
查詢是這樣的:
SELECT p.id , p.name,p.lastname,p.thumb
FROM friends AS f
RIGHT JOIN profiles AS p ON ( f.accepter = p.id OR f.inviter = p.id )
WHERE f.inviter = ##MY ID##
OR f.accepter = ##MY ID##
LIMIT 0 , 5000
你能告訴我如何獲取共同的朋友數據嗎?
注意:我沒有使用任何社交網絡腳本,如JCOW,社交引擎等。
編輯@ 2
在數據庫中,我有user1,user2,user3,user4,user5..userX
我想要一個可以獲取這些結果的查詢:
| id | name |lastname| thumb
1| 3 |raheel|shan | /img01.jpg
2| 7 | arqu |x | /img02.jpg
3| 8 |abcdef|hijklmno| /img06.jpg
一個可能很容易理解的查詢如下:
SELECT p.*
FROM
(
-- all friends of User A
SELECT accepter AS friend_id FROM friends WHERE inviter IN (##User_A_ID##)
UNION
SELECT inviter AS friend_id FROM friends WHERE accepter IN (##User_A_ID##)
) AS t1
-- intersect with
JOIN
(
-- all friends of User B
SELECT accepter AS friend_id FROM friends WHERE inviter IN (##User_B_ID##)
UNION
SELECT inviter AS friend_id FROM friends WHERE accepter IN (##User_B_ID##)
) AS t2
ON t1.friend_id = t2.friend_id
JOIN profiles p on p.id=t1.friend_id
也許有人可以想出一個更簡單的方法來做到這一點,但這是我的理由:
SELECT id,name,lastname FROM profiles,
(SELECT *
FROM friends
WHERE
(inviter = 1 OR accepter = 1)
AND (accepter IN (
SELECT inviter
FROM friends
WHERE accepter = 2 AND inviter != 1)
OR accepter IN (
SELECT accepter
FROM friends
WHERE inviter = 2 AND accepter != 1)
OR inviter IN (
SELECT inviter
FROM friends
WHERE accepter = 2 AND inviter != 1)
OR inviter IN (
SELECT accepter
FROM friends
WHERE inviter = 2 AND accepter != 1)))
f
WHERE id != 1 AND (inviter = id OR accepter = id);
其中user1的id = 1,user2的id = 2
如果您只是想要在兩個用戶(User_A和User_B)之間共享的朋友列表,那么這可能就足夠了:
SELECT accepter
FROM friends
WHERE inviter = ##User_A_ID##
AND accepter IN (
SELECT accepter
FROM friends
WHERE inviter = ##User_B_ID## )
加入您的個人資料表以獲取其他相關數據。
SELECT *
FROM profiles p
WHERE p.id IN (
SELECT f_id
FROM (
SELECT accepter as f_id FROM friends where inviter IN (1,2)
UNION
SELECT inviter as f_id FROM friends where accepter IN (1,2)
) friends
GROUP BY f_id
HAVING count(*) > 1
)
假設友誼是獨特的行....
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.