Frage Daten von einer vielen zu vielen db Beziehung erhalten


Ich habe eine Tabelle mit Benutzerkommentaren und möchte den letzten Kommentar jedes Benutzers abrufen.

Abfrage unten sollte Ihnen eine Vorstellung davon geben, was ich versuche zu tun

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
)

Die obige Abfrage funktioniert aber zu lange, besonders wenn viele userIds vorhanden sind.

Ich brauche eine schnellere Abfrage-Anweisung, die dasselbe bewirkt.


7
2017-07-05 03:56


Ursprung


Antworten:


Verwenden Sie einen Join statt einer Unterabfrage:

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 Unterauswahl in dieser Abfrage wird nur einmal ausgeführt, im Gegensatz zu a WHERE IN Unterabfrage, die für jede Zeile in der Kommentartabelle ausgeführt wird.


9
2017-07-05 04:00



Versuche es mit

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

Versuchen Sie herauszufinden, ob diese Abfrage Ihrer entspricht  Mit einem Index auf die userid Spalte, sollte dies mehr als anständig durchführen


0
2017-07-05 04:00



Lass es uns einfach halten:

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

0
2017-07-05 04:04