Sli*_*ady 2 php mysql sql select
我在论坛中创建了一个朋友系统.
我正在努力弄清楚如何通过mutual_friend计数来获取用户和订单.
我正在尝试构建一个显示推荐朋友列表的页面.
这是我的表格结构:
users table
-----
user_id | name |
friends table
-----
friend_id | from_id | to_id
Run Code Online (Sandbox Code Playgroud)
这是一个正在发生的事情的例子.
假设有总的A,B,C,D,E,F= 6人在现场.
A,而且B,C是我的朋友.D并且E又是朋友B.D也是朋友C,但是E是不是朋友C.F 不是网站任何人的朋友.因此,从以上数据看起来D并E是我的共同的朋友(A).F是不是我的一个共同的朋友.
既然D是两个朋友B和C和E是朋友只是 B:
A并D有2共同的朋友.A并E有1共同的朋友.A并F有0共同的朋友.现在,如果我想搜索(记住我A)不是我朋友的人,我可以这样做:
$myfriends = "2,3"; //putting all my friends in a variable
SELECT * FROM users WHERE user_id NOT IN( $myfriends )
但它会产生收益user_id ASC.
如何按DESC顺序进行搜索mutual_friends.?
我A就是user_id = 1
即拥有更多共同朋友的人是第一位的
请任何人都可以告诉我我该怎么做?我被困在这里很久了.我搜索了很多东西,但无法搞清楚.
此查询将考虑关系的互易性,因此如果关系变为"从A到B"或"从B到A"并不重要,它仍将返回预期结果.所以给出这样的表格:
CREATE TABLE people
(`id` int, `name` varchar(1))
;
INSERT INTO people
(`id`, `name`)
VALUES
(1, 'A'),
(2, 'B'),
(3, 'C'),
(4, 'D'),
(5, 'E'),
(6, 'F')
;
CREATE TABLE friends
(`id` int, `personId1` int, `personId2` int)
;
INSERT INTO friends
(`id`, `personId1`, `personId2`)
VALUES
(1, 1, 2),
(2, 3, 1),
(3, 2, 4),
(4, 5, 2),
(5, 3, 4)
;
Run Code Online (Sandbox Code Playgroud)
我相信这是按照你的描述设置的:A和B是朋友,A和C是朋友(注意倒置的关系),B和D是朋友,E和B是朋友(另一个倒置关系),C和D是朋友.
假设您想要的人的ID在@personId中:
SELECT StrangerId, COUNT(MutualFriendId) AS TotalMutualFriends
FROM
(SELECT
CASE WHEN f.personId2 = mf.friendId THEN f.personId1 ELSE f.personId2 END AS StrangerId,
CASE WHEN f.personId1 = mf.friendId THEN f.personId1 ELSE f.personId2 END AS MutualFriendId
FROM
(SELECT
CASE
WHEN personId1 = @personId THEN personId2
ELSE personId1
END AS friendId
FROM friends
WHERE personId1 = @personId OR personId2 = @personId) AS mf
INNER JOIN friends f
ON (personId1 != @personId AND personId2 = mf.friendId)
OR (personId1 = mf.friendId AND personId2 != @personId)
) AS totals
GROUP BY StrangerId
ORDER BY TotalMutualFriends DESC;
Run Code Online (Sandbox Code Playgroud)
@personId = 1的结果是:
StrangerId TotalMutualFriends
4 2
5 1
Run Code Online (Sandbox Code Playgroud)
这里有一个SQLFiddle来演示(我无法让它设置变量,因此它有一个1).