2012-03-31 6 views
0

Ich habe soziale Anwendung sagen wir wie Twitter, wo Benutzer anderen Benutzern folgen kann und mag einige Bemerkungen.Follower eines Benutzers und IDs der letzten 2 Kommentare von jedem Follower (falls vorhanden), auch die Anzahl der Anhänger Follower, mit mysql

Was ich abrufen muss, ist Anhänger eines Benutzers und IDs der letzten 2 Kommentare von jedem Follower (falls vorhanden), auch die Anzahl der Follower Anhänger, mit MySQL.

Hier sind die Tabellen

Tabelle user_follower

User_id follower_id 
1   2 
2   3 
1   5 
1   6 
1   7 

Tabelle user_likes

comment_id User_id date 
41   2  some_date 
42   2  some_date 
41   5  some_date 
42   5  some_date 
43   5  some_date 
43   2  some_date 
43   6  some_date 

wie können wir tun dies in einer einzigen mysql query?

so weit ich bin in der Lage, die Follower und die Anzahl der Follower Follower und folgen beide zu bekommen.

select uf.follower_id, 
(select count(*) from user_followers uf1 where uf1.follower_id = uf.follower_id) as following_count, 
(select count(*) from user_followers uf2 where uf2.user_id = uf.follower_id) as follower_count, 
from user_followers uf 
join users u on u.id = uf.follower_id 
where uf.user_id = 1 

, was ich will, ist nun die 2 neuesten comment_ids für jeden Follower zu erhalten, das heißt uf.follower_id hier. wenn nicht möglich, in derselben Abfrage, ich bin in Ordnung, auch mit einer anderen Abfrage, wie die follower_ids wie in Parametern übergeben, aber es soll mir 2 neuesten Kommentar gibt für jede übergeben id ..

+0

Erster Eindruck: WOW! –

+0

Joe Celkos exzellentes Buch * SQL For Smarties * ist voll von Beispielen für SQL, um so etwas zu tun. –

+0

kann das Buch jetzt nicht kaufen. – asm234

Antwort

0

ich denke, das wird funktionieren. Ich habe es nicht getestet, daher kann es Syntaxfehler geben. Angesichts der Verschachtelungsebene, die in dieser Abfrage verwendet wird, vermute ich, dass sie bei einem sehr großen Datensatz schlecht funktioniert.

SELECT follower_id, num_followers, GROUP_CONCAT(comment_id) 
FROM (
    SELECT t.*, 
     @r := IF(@g = t.follower_id, @r+1, 1) RowNum, 
     @g := t.follower_id 
    FROM (select @g:=null) AS initvars 
    INNER JOIN (
     SELECT followers.*, ul.comment_id 
     FROM (
      SELECT 
       uf1.user_id, 
       uf1.follower_id, 
       COUNT(uf2.follower_id) AS num_followers 
      FROM user_follower uf1 
      LEFT JOIN user_follower uf2 
       ON uf1.follower_id = uf2.user_id 
      WHERE uf1.user_id = 1 
      GROUP BY uf1.user_id, uf1.follower_id 
     ) AS followers 
     LEFT JOIN user_likes ul 
      ON followers.follower_id = ul.user_id 
     ORDER BY followers.follower_id ASC, comment_id DESC 
    ) AS t 
) AS final 
WHERE RowNum < 3 
GROUP BY follower_id, num_followers; 

UPDATE ist die andere Abfrage mit der Ungleichheit beitreten -

SELECT tmp.follower_id, COUNT(uf2.follower_id) AS num_followers, tmp.comments 
FROM (
    SELECT follower_id, GROUP_CONCAT(comment_id ORDER BY comment_id DESC) AS comments 
    FROM (
     SELECT uf.follower_id, ul1.* 
     FROM user_follower uf 
     LEFT JOIN user_likes ul1 
      ON uf.follower_id = ul1.user_id 
     LEFT JOIN user_likes ul2 
      ON uf.follower_id = ul2.user_id 
      AND ul1.comment_id < ul2.comment_id 
     WHERE uf.user_id = 1 
     GROUP BY ul1.user_id, ul1.comment_id 
     HAVING COUNT(ul2.comment_id) < 2 
    ) AS tmp 
    GROUP BY tmp.follower_id 
) AS tmp 
LEFT JOIN user_follower uf2 
    ON tmp.follower_id = uf2.user_id 
GROUP BY tmp.follower_id 
+0

Yups, es wird verdammt langsam für mich. aber danke für deine Bemühungen. Ich denke, es ist besser, mit einer anderen Abfrage zu gehen. so ist mein einziges Problem übrig, die letzten 2 Kommentare für jeden Benutzer zu finden, der die userids gegeben hat. – asm234

+0

Hier ist ein großartiger Link und ich fand meine Antwort ziemlich schnell von diesem. Http://www.artfulsoftware.com/infotree/queries.php#104 Suche Innerhalb der Gruppe Kontingente (Top N pro Gruppe) – asm234

+0

Ich schrieb zunächst eine Abfrage mit der INEQUALITY JOIN-Methode, aber es lief schlecht mit meinem Test-Dataset. Ich werde es hier posten, wenn ich es finde. Wie viele Datensätze haben Sie in jeder Ihrer Tabellen? Wie hoch ist die durchschnittliche Anzahl an Likes pro Nutzer? Wie hoch ist die durchschnittliche Anzahl der Follower pro Nutzer? Ich werde versuchen, eine realistische Verteilung in meinen Testdaten zu erreichen. – nnichols

Verwandte Themen