2013-02-08 30 views
8

Ho visto soluzioni per qualcosa di simile su altri post, ma ho riscontrato un problema applicandolo al mio problema specifico.MySQL - Unisci tabelle, recupera solo Max ID

ecco la mia join iniziale:

SELECT service_note_task, comment_id, comment FROM service_note_task LEFT JOIN service_note_task_comments ON service_note_task.service_note_task_id = service_note_task_comments.service_note_task_id; 

che si traduce in:

+-----------------------------+------------+--------------+ 
| service_note_task   | comment_id | comment  | 
+-----------------------------+------------+--------------+ 
| This is service note task 3 |   25 | Comment  | 
| This is service note task 3 |   26 | Comment Blah | 
| This is service note task 3 |   36 | aaa   | 
| This is service note task 2 |   13 | Awesome comm | 
| This is service note task 1 |   12 | Cool Comm | 
+-----------------------------+------------+--------------+ 

Ma per ogni service_note_task, ho davvero solo bisogno di una riga che rappresenta il commento con il più alto COMMENT_ID, in questo modo:

+-----------------------------+------------+--------------+ 
| service_note_task   | comment_id | comment  | 
+-----------------------------+------------+--------------+ 
| This is service note task 3 |   36 | aaa   | 
| This is service note task 2 |   13 | Awesome comm | 
| This is service note task 1 |   12 | Cool Comm | 
+-----------------------------+------------+--------------+ 

I figura Potrei usare MAX in un'istruzione di sottoselezione per narrare i risultati come li voglio io. Come posso incorporarlo nella mia dichiarazione per ottenere questi risultati?

risposta

0

poiché non l'ha parlare del RDBMS che si sta utilizzando, la query di seguito lavora principalmente su molti RDBMS (non tutti)

SELECT a.*, b.* -- select only the columns you want. 
FROM service_note_task a 
     INNER JOIN service_note_task_comments b 
      ON a.service_note_task_id = b.service_note_task_id 
     INNER JOIN 
     (
      SELECT service_note_task_id, MAX(commentID) max_ID 
      FROM service_note_task_comments 
      GROUP BY service_note_task_id 
     ) c ON b.service_note_task_id = c.service_note_task_id AND 
       b.commentID = c.max_ID 

se il RDBMS supporta funzioni di analisi, è possibile utilizzare questo seguito,

SELECT a.service_note_task, b.comment_id, b.comment 
FROM service_note_task a 
     INNER JOIN 
     (
      SELECT service_note_task_id, comment_id, comment, 
        ROW_NUMBER() OVER (PARTITION BY service_note_task_id 
             ORDER BY comment_id DESC) rn 
      FROM service_note_task_comments 
      GROUP BY 
     ) c ON a.service_note_task_id = b.service_note_task_id AND 
       b.rn = 1 
+0

service_note_task_id deve essere aggiunto al "gruppo da" sezione all'interno del subquery – Noxthron

0

prova:

SELECT service_note_task, comment_id, comment 
FROM service_note_task SNT1 
LEFT JOIN service_note_task_comments ON service_note_task.service_note_task_id = service_note_task_comments.service_note_task_id 
WHERE comment_id = (SELECT MAX(comment_id) FROM service_note_task SNT2 WHERE SNT1.service_note_task = SNT2.service_note_task); 
0
SELECT service_note_task, comment_id, comment 
FROM service_note_task s LEFT JOIN service_note_task_comments sc 
    ON s.service_note_task_id = sc.service_note_task_id; 
WHERE EXISTS (
       SELECT 1 
       FROM service_note_task_comments s2 
       WHERE s.service_note_task_id = s2.service_note_task_id 
       HAVING MAX(s2.comment_id) = sc.comment_id 
      ) 
+0

sii fu la risposta più vicina, grazie, ma non ancora proprio quello di cui avevo bisogno. Ha restituito l'ultimo commento per l'attività di servizio 3, ma non ha restituito le altre righe, nota di servizio 2 e 1. – jwBurnside

+0

Mostra parte dei dati e cerco di risolvere un problema. –