簡體   English   中英

通過共同朋友搜索 - 朋友系統Mysql PHP

[英]Search by Mutual Friends Count - Friend System Mysql PHP

我在論壇中創建了一個朋友系統。

我正在努力弄清楚如何通過mutual_friend計數來獲取用戶和訂單。

我正在嘗試構建一個顯示推薦朋友列表的頁面。

這是我的表格結構:

users table
-----
user_id | name |

friends table
-----
friend_id | from_id | to_id

這是一個正在發生的事情的例子。

假設站點中總共有ABCDEF = 6人。

  • 我是ABC是我的朋友。
  • DE又是B朋友。
  • D也是C的朋友,但E 不是 C的朋友。
  • F不是網站任何人的朋友。

因此,根據以上數據,看起來DE是我的共同朋友( A )。 F 不是我的共同朋友。

由於DBC朋友, E 只是 B朋友:

  • AD2共同的朋友。
  • AE1共同的朋友。
  • AF0共同的朋友。

現在,如果我想搜索(記住我是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 ie 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)
;

我相信這是按照你的描述設置的: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;

@personId = 1的結果是:

StrangerId  TotalMutualFriends
4           2
5           1

這里有一個SQLFiddle來演示(我無法讓它設置一個變量,因此它有一個1)。

也許是這樣的事情:

Select user_id, friends.to_id, count(friend_of_friend.to_id)
from users left outer join
    friends on users.user_id = friends.from_id left outer join
    users as friend_user on friends.to_id = friend_user.user_id left outer  join
    friends as friend_of_friend on friend_user.user_id =    friend_of_friend.from_id and friend_of_friend.to_id in (select to_id from friends where from_id = users.user_id)
Group by USER_ID, friends.to_id
Order by 3

為清晰起見編輯:此查詢的邏輯取決於多次連接同一個表。 前兩個聯接非常簡單,我們從一個用戶表開始,然后加入將每個用戶與他們所有朋友聯系起來的朋友表。 但是我們再次加入用戶表,但這次使用“to”列 - 我們正在獲取每個朋友的用戶信息。 由於我們在查詢中不能兩次使用相同的表名,因此我們給它一個別名“friend_user”。 然后我們再次加入friends表,基於friend_user表中的id - 這給了我們每個原始用戶的朋友的所有朋友。 然后我們限制朋友的朋友,我們使用“Friend_of_friend.to_id in ...”將朋友的朋友與所有原始用戶朋友的列表進行比較,我們通過子查詢引入 - 該部分只是在括號內的“in”之后。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM