Freund eines Freundes in PHP / MySQL?

stimmen
2

Ich habe ein soziales Netzwerk ähnlich wie myspace / facebook. In meinem Code sind Sie entweder ein Freund Person oder kein Freund, so zeige ich alle Aktionen von Menschen, die Sie Freunde sind mit (in diesem Beitrag habe ich auf Aktionen als Bulletin-Beiträge allein beziehen, um es einfacher zu visualisieren.

So können Sie eine Person jedes Mal ein Bulletin veröffentlichen wird es jeder Person zeigen, die dort Freund.

In mysql würden Sie eine Person Freundesliste erhalten, indem so etwas wie dies zu tun,

SELECT user_id FROM friends WHERE friend_id = 1 (user ID)

Ich möchte wissen, wie eine Website wie Facebook und einige andere würden alle Bulletin Post von Ihren Freunden zeigen und von deinen Freunden Freunde?

Wenn jemand eine Idee hat, bitte einige Codes wie welche Art von MySQL Query zeigen?

Veröffentlicht am 30/12/2009 um 00:07
quelle vom benutzer
In anderen Sprachen...                            


5 antworten

stimmen
3

Sie tun, um eine Unterabfrage:

SELECT DISTINCT user_id FROM friends WHERE friend_id IN (SELECT user_id FROM friends WHERE friend_id = 1)

Beantwortet am 30/12/2009 um 00:12
quelle vom benutzer

stimmen
2

Testen Sie diese beiden für die Leistung:

SELECT DISTINCT user_id
FROM friends f1
JOIN friends f2 ON f1.friend_id = f2.user_id
WHERE f2.friend_id = 1

und

SELECT DISTINCT user_id
FROM friends
WHERE friend_id IN (SELECT user_id FROM friends WHERE friend_id = 1)

Oft sind sie das gleiche, aber manchmal sind sie nicht.

Stellen Sie sicher, friend_id und User_id indiziert sind.

Beantwortet am 30/12/2009 um 00:16
quelle vom benutzer

stimmen
6

Die Antwort ist, dass sie auf einem Freund Tabelle nicht tun wählt werden, werden sie höchstwahrscheinlich eine de-normalisierte Nachrichten-Ereignistabelle verwenden. Wir führten einen News-Feed ähnlich wie Facebooks auf DoInk.com, hier ist, wie wir es getan haben:

Es ist der Begriff eines „Newsevent“ Es hat einen Typen, einen Initiator (eine Benutzer-ID) und einen Zielbenutzer (auch eine Benutzer-ID). (Sie können auch zusätzliche Spalte (n) für andere Eigenschaften, die für die Veranstaltung oder sich ihnen in)

Wenn ein Benutzer Beiträge etwas auf einem anderen Benutzer der Wand erzeugen wir eine Veranstaltung wie folgt aus:

INSERT IGNORE  INTO events VALUES (wall_post_event, user1, user1)

Wenn benutzer1 Profil sehen, dann würden Sie für alle Ereignisse auswählen, in dem user1 entweder der Initiator oder das Ziel. Das ist, wie Sie das Profil-Feed angezeigt werden soll. (Sie können Ihre Lust zu bekommen und Ereignisse herauszufiltern, je nach Ihrem Privatsphäre-Modell. Sie können prüfen, dies aus Performance-Gründen im Gedächtnis zu tun)

Beispiel:

SELECT * FROM events WHERE initiator = user1 or target = user1 //to see their profile feed

SELECT * FROM events WHERE initiator IN (your set of friend ids) //to see your newsfeed

Wenn Sie den Newsfeed für alle Veranstaltungen in Bezug auf Ihre Freunde sehen wollen, können Sie eine Abfrage Auswahl für alle Veranstaltungen tun, wo der Initiator in der Reihe von Freunden ist.

Vermeiden Sie Implementierungen mit Unter wählt, abhängig von der Komplexität, werden sie nicht skalieren.

Beantwortet am 30/12/2009 um 00:20
quelle vom benutzer

stimmen
1

Der einfache Ansatz wäre eine Art von einfacher verschachtelter Klausel zu tun. So sagt, Sie haben eine Tabelle mit Pfosten und die Poster-ID und einen Freund-Tabelle, die erste Schicht wäre

SELECT post FROM posts JOIN friends 
  on post.userid = friends.friend_id 
  WHERE friend.id = 1 (user ID)

dann einen Freund von Freunden zu bekommen

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)

Sie können wiederholen dies jedes Mal nisten Sie eine weitere Ebene der Freund Abstraktion hinzufügen möchten. Das Problem bei diesem Ansatz ist, dass es eine sehr lange Zeit in Anspruch nehmen würde, auszuführen. Für jedes Mal, fügen Sie eine Schicht von Freund Abstraktion Sie die Komplexität durch eine Potenz von n erhöhen (wobei n die Anzahl der Zeilen in der Tabelle ist).

Es ist wahrscheinlicher, dass sie die sichtbaren Freunde in einer Tabelle irgendwo speichern, so lässt einen neuen eingereicht namens friends_web machen

user_id, friend_id, level

wenn ein Benutzer Freund jemand, fügt es, dass neuen Freund in friends_web auf einem Niveau von 0 (da dieser Freund kein Volk ist weg), dann fügt hinzu, dass auf einem Niveau von 1 Freunden (seit seinem 1 Freund weg). Um die Tabelle Integrität zu halten würden Sie auch den invertierten Datensatz hinzufügen möchten. Um zu klären, ob A B als Freund hinzufügt und C ist ein Freund von B, würden die beiden folgenden Einträge werden hinzugefügt, um unsere neue Tabelle

A, C, 1
C, A, 1

da jetzt kann A siehe C und C A. sehen

jetzt, wenn wir wollen eine Abfrage, die wir gerade tun

 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)

indem Sie, dass Sie Ihre Abfrage Komplexität minimieren, wenn Post-Lookups zu tun, während der Lage, mehr als 1 Schicht tief in einen Freund Web zu suchen.

Sorry für die lange umständliche Antwort.

Beantwortet am 30/12/2009 um 00:52
quelle vom benutzer

stimmen
0

Dies sollte herausziehen der Beiträge der uns alle Benutzer Freund.

SELECT * FROM posts WHERE uid IN (SELECT friend_uid FROM friends WHERE uid=1) ORDER BY post_id DESC

Dies sollte alle Beiträge herausziehen, die Ihr Freund eines Freundes sind.

SELECT * FROM posts WHERE uid IN (SELECT friend_uid FROM friends WHERE uid IN (SELECT friend_uid FROM friends WHERE uid=1)) ORDER BY post_id DESC

Beantwortet am 30/12/2009 um 01:14
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more