L'approche simple serait de faire une sorte de clause imbriquée simple.Alors que vous avez une table avec les messages et l'id affiches, et une table d'amis, la première couche serait
SELECT post FROM posts JOIN friends
on post.userid = friends.friend_id
WHERE friend.id = 1 (user ID)
puis d'obtenir un des amis d'amis
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)
Vous pouvez répéter cette imbrication chaque temps que vous voulez ajouter une autre couche d'abstraction d'ami. Le problème avec cette approche est que cela prendrait beaucoup de temps à s'exécuter. A chaque fois que vous ajoutez une couche d'abstraction d'ami, vous augmentez la complexité par une puissance de n (où n est le nombre de lignes dans votre table).
Il est plus probable qu'ils épargnent les amis visibles dans une table quelque part, laisse faire un nouveau déposé appelé friends_web
user_id, friend_id, level
lorsqu'un quelqu'un d'amis de l'utilisateur, il ajoute que nouvel ami dans friends_web à niveau de 0 (puisque cet ami n'est pas loin) puis ajoute ces amis amis à un niveau de 1 (depuis son 1 ami). Afin de conserver l'intégrité de la table, vous devez également ajouter l'enregistrement inversé. Pour préciser si A ajoute B comme ami et C est un ami de B, les deux documents suivants se sont ajoutés à notre nouvelle table
A, C, 1
C, A, 1
depuis maintenant A peut voir C et C peuvent voir A.
maintenant, quand nous voulons une question nous faisons juste
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)
en faisant que vous minimisé la complexité de votre requête lorsque vous effectuez des recherches post tout en étant capable de regarder plus de 1 couche profonde dans une toile d'ami.
Désolé pour la réponse longue et sinueuse.
esprit que vous, je suis sûr que ce n'est pas comment il fait facebook, ils ont beaucoup d'optimisations qu'ils font, et ils utilisent ne certainement pas hors de la base de données relationnelle de conservation. – twolfe18
Devrait probablement DISTINCT que de sorte que vous obtenez seulement un user_id une fois, même si elles semblent être des amis avec ** lots ** de personnes. – GrayWizardx
Ils utilisent MySQL ... – cletus