2017-05-11 2 views
3

Diese Frage bezieht sich auf die vorherige Frage. Sie können meine erste Post überprüfen here'Freunde von Freunden' SQL-Abfrage

Ich versuche, Daten aus einer Tabelle Benutzer zu ziehen, und ich brauche 'Freunde von Freunden', diejenigen, die zwei Schritte von dem gewählten Benutzer sind aber nicht direkt mit dem ausgewählten Benutzer verbunden

ich mit dieser Abfrage versucht:

select 
u.* 
from user u 
    inner join friend f 
    on u.user_id = f.friend_id 
     inner join friend ff 
     on f.user_id = ff.friend_id 
where ff.user_id = {$user_id} AND u.user_id <> {$user_id}; 

ich nicht wusste, wie Benutzer zu ziehen, die nicht direkt mit dem gewählten Benutzer verbunden sind. Ich bekomme alle Freunde von Freunden des aktuellen Benutzers, aber ich auch bekommen direkte Freunde des aktuellen Benutzers.

enter image description here

Antwort

1

Sie müssen nur diejenigen ausschließen, die sind direkte Freunde sowie Freunde von Freunden. Ich habe die Tabelle Aliase neu angeordnet, so dass es etwas klarer (für mich jedenfalls) ist, was abgerufen Sein:

SELECT 
    u.* 
FROM 
    user u 
    INNER JOIN friend ff ON u.user_id = ff.friend_id 
    INNER JOIN friend f ON ff.user_id = f.friend_id 
WHERE 
    f.user_id = {$user_id} 
    AND ff.friend_id NOT IN 
    (SELECT friend_id FROM friend WHERE user_id = {$user_id}) 

Es beseitigt auch die Notwendigkeit, die Benutzer-ID auszuschließen abgefragt werden.

0

Sie sind auf dem richtigen Weg. Sie benötigen eine in dem die Bedingung hinzuzufügen, die in direktem Zusammenhang mit denen, die nicht enthalten ist:

select u.* 
from user u 
inner join friend f on u.user_id = f.friend_id 
inner join friend ff on f.user_id = ff.friend_id 
where ff.user_id = {$user_id} AND u.user_id <> {$user_id}; 
     AND not exists 
      (select f2.friend_id 
      from friend f2 
      where f2.friend_id = ff.friend_id 
       and u.user_id = f2.user_id) 

Die zusätzliche not exists-Klausel, die ich zu Ihrer Anfrage hinzugefügt prüft, ob der zweite Grad Freund ist auch kein Erststudium Freund.

0

ich eine nicht-korrelierten Unterabfrage verwenden würde, die die IDs der direkten Freundschaften von {$user_id} abruft und diese Benutzer aus dem Endergebnis auszuschließen:

select u.* 
from user u 
inner join friend f on u.user_id = f.friend_id 
inner join friend ff on f.user_id = ff.friend_id 
where ff.user_id = {$user_id} AND u.user_id <> {$user_id} 
     AND u.user_id not in (
      select directFriend.friend_id 
      from friend directFriend 
      where directFriend.user_id = {$user_id}) 
Verwandte Themen