Basit bir yaklaşım, basit iç içe maddesinin çeşit yapmak olacaktır. Yani mesaj içeren bir tablo ve posterler kimliği ve bir arkadaş tablo var ki, birinci tabaka olacak
SELECT post FROM posts JOIN friends
on post.userid = friends.friend_id
WHERE friend.id = 1 (user ID)
o arkadaşlar bir arkadaş almak için
SELECT post FROM posts JOIN
(SELECT DISTINCT friends_2.friend_id FROM friends AS friends_1
JOIN friends as friends_2
on friends_1.friend_id = friends_2.id where friends_1.id = 1)
AS friends
wHERE post.userid = friends.friend_id AND mainid = 1 (user ID)
Bu Yerleştirme Dost soyutlama başka bir katman eklemek istediğiniz her zaman tekrarlayabilirsiniz. Bu yaklaşımla sorun yürütmek için çok uzun bir zaman alacağını olduğunu. Eğer arkadaşım soyutlama katmanı eklemek her zaman için n (n sizin tablodaki satırların sayıdır) bir güç tarafından karmaşıklığı artmaktadır.
Onlar bir yerde bir tablo görüntülenebilir arkadaşlar tasarrufu olduğunu daha olasıdır, bu nedenle yeni bir masaya çağırdı friends_web yapmanıza olanak sağlar
user_id, friend_id, level
Bir kullanıcı arkadaşlar birisi, bir 0 düzeyinde friends_web yeni arkadaş (o arkadaşına beri uzak hayır insanlar) olduğunu ekler o zaman ekler (ötede 1 arkadaşına beri) 1 seviyesinde arkadaş arkadaş. Tablo bütünlüğünü korumak için ayrıca ters kayıt eklemek isterim. Bir arkadaş olarak ekler B ve C B bir arkadaşı olup olmadığını açıklığa kavuşturmak için, aşağıdaki iki kayıtlar yeni tabloya eklenir alacağı
A, C, 1
C, A, 1
şimdi bu yana A, C ve C A'ya görebilirsiniz görebilirsiniz
şimdi biz sadece bunu bir sorgu istediğinizde
SELECT post FROM posts
JOIN friends_web ON post.user_id = friends_web.friend_id
WHERE friends_web.user_id = user_id AND friends_web.level < 2 (or however deep you want to look)
Derin bir arkadaş web içine daha sonra 1 tabaka bakmak mümkün olurken sonrası aramalarını yaparken sorgu karmaşıklığı en aza yaparak.
Uzun soluklu bir yanıt için özür dilerim.