2016-04-05 7 views
1

Ich kann nicht Ereignis die Frage in Englisch zu gut zusammenfassen, so die Umwandlung zu SQL ist verwirrend mich.Schlage vor, wem ich folgen sollte, basierend auf den Leuten, die mir folgen, folge mir selbst

Ich habe eine Benutzertabelle und eine Folgetabelle

USER 
id | first_name | last_name 
10 | Homer  | Simpson 
12 | Marge  | Simpson 
14 | Bart  | Simpson 
16 | Lisa  | Simpson 

FOLLOW 
id | follow_id | follower_id | status 
1 | 10  | 12   | APPROVED 
2 | 10  | 14   | APPROVED 
3 | 16  | 12   | APPROVED 
4 | 16  | 14   | APPROVED 

Grundsätzlich ich einen Benutzer vorschlagen will, andere Menschen, die er folgen mögen.

Ich werde dies auf Basis:

  • alle Leute, mir zu folgen finden und wenn ich nicht schon bin ihnen zu folgen, schlage ich ihnen folgen
  • aus dieser ersten Liste (die folgen me), finden alle Menschen, dass sie
  • für jede dieser folgen, lassen vermuten, dass ich diese Personen folgen (wenn ich nicht schon tue so)

Ist jemand in der Lage mich in die richtige Richtung zu helfen ?

In den obigen Beispieldaten

  • Homer bereits von Marge und Bart verfolgt wird
  • wiederum Marge folgt Lisa (und Bart ist auch Lisa folgende)

So, in diesem Beispiel möchte ich Homer vorschlagen gerne folgen:

  • Marge (weil sie folgt ihm)
  • Bart (weil er ihm folgt)
  • Lisa (weil sie von Marge verfolgt wird)

MIT HILFE VON RICHARD, DIES IST DIE ENDLÖSUNG (AS A STORED PROC)

Die einzige Ergänzung ist die Entfernung von Benutzern, die bereits befolgt werden.

BEGIN 
    SELECT DISTINCT t1.ID,first_name,last_name FROM 
    (
     #Users that are following me 
     SELECT u.id as ID, u.first_name , u.last_name 
     FROM mchq_user u 
     INNER JOIN follow AS f ON u.id = f.follower_id 
     WHERE f.follow_id = in_userID 
     UNION 

     #Users followed by followers of me 
     SELECT f2.follow_id as ID, u2.first_name, u2.last_name 
     FROM mchq_user u 
     INNER JOIN follow AS f ON u.id = f.follower_id 
     INNER JOIN follow AS f2 ON f2.follower_id = u.id 
     INNER JOIN mchq_user AS u2 ON u2.id = f2.follow_id 
     WHERE f.follow_id = in_userID AND f2.follow_id != in_userID 
    ) AS t1 
    WHERE t1.Id NOT IN (
     # Users that I follow already 
     SELECT u.id 
     FROM mchq_user u 
     INNER JOIN follow AS f ON u.id = f.follow_id 
     WHERE f.follower_id = in_userID 
    ); 
END 
+1

Haben Sie eine SQL-Abfrage oder eine Arbeit haben Sie bereits getan haben, zu betrachten und bieten Beratung zu? "Kann mir jemand in die richtige Richtung helfen?" ist keine detaillierte Frage oder Beschreibung des Problems, das Sie haben. – Dresden

Antwort

1
CREATE TABLE #user (id INT, first_name VARCHAR(50), last_name VARCHAR(50)) 
CREATE TABLE #follow (user_id INT, following_id INT, f_status VARCHAR(50)) 


INSERT INTO #user (id, first_name, last_name) 
SELECT 10, 'Homer','Simpson' UNION ALL 
SELECT 12, 'Marge','Simpson' UNION ALL 
SELECT 14, 'Bart','Simpson' UNION ALL 
SELECT 16, 'Lisa','Simpson' 

INSERT INTO #follow (user_id, following_id, f_status) 
SELECT 12 , 10 , 'APPROVED' union all 
SELECT 14 , 10 , 'APPROVED' union all 
SELECT 12 , 16 , 'APPROVED' union all 
SELECT 14 , 16 , 'APPROVED' 

-- Usrs that follow Homer 
SELECT id, first_name , last_name 
FROM #user u 
INNER JOIN #follow AS F ON u.id = F.user_id 
WHERE f.following_id = 10 
UNION 
-- Users followed by followers of Homer 
SELECT F2.following_id, u2.first_name, U2.last_name 
FROM #user u 
INNER JOIN #follow AS F ON u.id = F.user_id 
INNER JOIN #follow AS F2 ON F2.user_id = u.id 
INNER JOIN #user AS U2 ON U2.id = F2.following_id 
WHERE f.following_id = 10 AND F2.following_id != 10 



DROP TABLE #follow 
DROP TABLE #user 
+0

Danke Ricardo. Das funktionierte wie beschrieben, vor allem nachdem ich herausgefunden hatte, dass Ihre Spaltenbenennungskonvention das Gegenteil zu dem Modell war, das ich in meinem Kopf hatte. –

+0

@RobinM Gut zu helfen. Die ganzen Dinge können schwindlig werden. Leider habe ich vergessen, Sie zu den Änderungen der Spalte zu kommentieren. –

1

Könnten Sie eine Unterabfrage für die folgen müssen sein

select distinct a.follower_id, b.first_name, b.last_name from follower as a 
inner join user as b on b.id =a.follower_id 
where follow_id in (select follower_id 
          from follow 
         where follow_id = '10' and status = 'APPROVED'); 
+0

Was ist mit den Followern Ihres Benutzers, die Personen folgen, denen Sie gerade nicht folgen? Sie stellen grundsätzlich Personen bereit, die Ihrem Nutzer gefolgt sind und bereits akzeptiert wurden. Sie haben keine Möglichkeit zu sagen, wem diese Person in dieser Abfrage folgt oder nicht. – Dresden