2012-07-05 30 views
7

Ich habe eine Tabelle, die Benutzer Kommentare enthält, und ich möchte den letzten Kommentar von jedem Benutzer abgerufen werden.Daten von einer vielen zu vielen DB-Beziehung erhalten

Abfrage unten sollte geben u eine Vorstellung von dem, was ich versuche,

select comment, comment_id, userId FROM comments_table 
WHERE comment_id in (
    SELECT MAX(comment_id) 
    FROM comments_table where userId in (2001, 2002, 2010) 
    GROUP BY userId 
) 

Above Abfrage Werke zu tun, aber zu lange dauert, vor allem wenn es viele userIds.

Ich brauche eine schnellere Abfrage-Anweisung, die das gleiche erreicht.

Antwort

9

Verwenden Sie eine anstelle einer Unterabfrage beitreten:

SELECT 
    b.* 
FROM 
    (
     SELECT userid, MAX(comment_id) AS maxcomment 
     FROM comments_table 
     WHERE userid IN (2001, 2002, 2010) 
     GROUP BY userid 
    ) a 
INNER JOIN 
    comments_table b ON 
     a.userid = b.userid AND 
     a.maxcomment = b.comment_id 

Die Sub-select in dieser Abfrage wird nur einmal ausgeführt werden, wie auf eine WHERE IN subquery gegenüber, die für jede Zeile in der Tabelle Kommentare ausführt.

+0

reduzierte Abfragezeit von 1sec bis 0,0026. danke – user1502826

+0

was würde ich zur obigen Frage hinzufügen müssen, wenn es eine andere Tabelle gibt, die user_details als u genannt wird, dass ich Spalten u.mainimage und u.fullname möglicherweise auch mit b.user_id = u.user_id – user1502826

+0

extrahieren möchte, was Tabelle 'user_details' würde Verbindung herstellen zu? Die Kommentartabelle? Benutzer Tabelle? –

0

Versuchen mit

  select comment, comment_id, userId FROM   comments_table WHERE userId in (2001, 2002, 2010) order by comment_id desc limit 1 

versuchen und sehen, ob diese Abfrage mit Ihren Mit einem Index auf der userid Spalte entspricht, sollte dies mehr ab als anständig

+0

Dadurch wird nur eine Zeile abgerufen: * der letzte Kommentar, der von einem der drei Benutzer * abgegeben wurde. Der O.P fragt nach dem letzten Kommentar, der von *** jedem *** der drei Benutzer gemacht wurde, was bedeutet, dass Sie ein gruppenweises Maximum für die von jedem Benutzer gemachten Kommentare ausführen müssen. –

0

Lassen Sie uns es einfach halten:

SELECT comment, MAX(comment_id), userId 
FROM comments_table 
WHERE userId IN (2001, 2002, 2010) 
GROUP BY userId; 
+0

Diese Lösung wird die letzte 'comment_id' pro' userid' ziehen, aber das Feld 'comment' stimmt nicht mit der' comment_id' überein. –

Verwandte Themen