2012-07-05 24 views
7

Ho una tabella che contiene i commenti degli utenti e voglio recuperare l'ultimo commento fatto da ogni utente.ottenere i dati da una relazione molti a molti db

Query in basso dovrebbe dare u un'idea di quello che sto cercando di fare

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 
) 

Sopra opere di query, ma impiega troppo tempo, soprattutto se ci sono molti userids.

Ho bisogno di un istruzione di query più veloce che compie la stessa cosa.

risposta

9

Utilizzare un join invece di una sottoquery:

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 

Il sub-select in questa query eseguirà solo una volta, al contrario di un WHERE IN sottoquery che eseguirà per ogni riga della tabella commenti.

+0

tempo di query ridotto da 1 sec a 0,0026. grazie – user1502826

+0

cosa avrei bisogno di aggiungere alla query precedente se c'è un'altra tabella chiamata user_details come tu voglio estrarre anche le colonne u.mainimage e u.fullname magari usando b.user_id = u.user_id – user1502826

+0

Quale tabella sarebbe 'user_details'? collegare il collegamento a? La tabella dei commenti? Tabella utenti? –

0

Prova con

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

provare e vedere se questa query è equivalente con il vostro Con un indice sulla colonna userid, questo dovrebbe eseguire più di decente

+0

Questo recupererà solo una riga: * il singolo commento più recente fatto da uno dei tre utenti *. L'O.P. chiede il commento più recente fatto da *** ogni *** dei tre utenti, il che significa che è necessario eseguire un massimo di gruppo per i commenti fatti da ciascun utente. –

0

teniamolo semplice:

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

Questa soluzione tirerà il più recente 'comment_id' per' userid', ma il campo 'comment' non sarà nella corrispondenza corretta con' comment_id'. –

Problemi correlati