[英]Design a friends table for a social networking site
嗨,我面臨有關用於存儲用戶所有好友列表的表結構的問題。 在下表中,如果用戶84請求與用戶70和74保持友誼,那么我使用的表是用戶84 ,朋友是70和74 ,反之亦然。 類似地,用戶77具有84 。
但是問題是,如果我想找出用戶84(即用戶( 70,74,77 ))的所有朋友及其詳細信息。
我是否應該輸入重復的記錄(如圖片2 Ex):如果用戶84在用戶70接受請求時向用戶70發送好友請求,則將插入另一行,例如user_id 70和friend_id 84 。
或是否有任何基於Friends表的列值的mysql查詢與users表聯接。 就像如果user_id為84一樣 ,它將基於friend_id進行聯接 ,如果friend_id為84則它將通過使用user_id列與用戶表聯接 。
您可以使用聯接查詢來獲取結果。 無需添加重復條目
基於第一個表設計,您可以為此使用UNION以獲得特定用戶ID的所有朋友:
SELECT f.friend_id FROM friends f WHERE f.user_id = 84
UNION ALL
SELECT f.user_id FROM friends f WHERE f.friend_id = 84
輸出為:
+-----------+
| friend_id |
+-----------+
| 70 |
| 74 |
| 77 |
+-----------+
3 rows in set
我假設在您的系統中友誼是對稱的,即如果A是與B的朋友,則意味着B也是與A的朋友。在這種情況下,建議您更改Friend表的列以反映兩個人平等的事實。關系中的地位,例如
友人
有了它,您可以執行類似這樣的查詢
SELECT * FROM User WHERE User.UserId IN (
(SELECT User1_Id FROM Friend WHERE User2_Id = MY_USER_ID)
UNION
(SELECT User2_Id FROM Friend WHERE User1_Id = MY_USER_ID)
)
這將使用子選擇而不是聯接,再加上並集,以根據朋友表中列出的圍繞用戶的方式來獲得朋友的用戶ID的單個列表。 子查詢和並集的文檔。
可能值得這樣保存,而不是通過在Friends表中為每種關系分配兩行來簡化代碼(A,B和B,A)。 如果您有N個用戶,則如果重復,則Friends表最多具有N *(N-1)行,如果沒有,則有一半。
SELECT * FROM friends AS f
LEFT JOIN users AS u ON f.user_id = u.user_id
AND f.friend_id = u.user_id
WHERE f.friend_id = 84 OR f.user_id = 84
我沒有嘗試過,但是希望對您有用。
該查詢將為您提供包括用戶XXXX的朋友的所有條目
select * from friendshipTable where user_id = XXXX or friend_id = XXXX
經過很長一段時間的搜索,我找到了使用以下聯接操作並且無需輸入重復條目來解決問題的最佳方法。 這是我的查詢
SELECT users.* FROM friends
LEFT JOIN users ON
(users.`id` = friends.`user_id` OR users.`id` = friends.`friend_id`)
AND
users.`id` != '84'
WHERE
friends.`user_id` = '84'
OR
friends.`friend_id`='84'
我已經將user_id = 84設為靜態,因此可以根據需要使它成為動態的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.