2012-09-01 20 views
6

Ho una tabella con un seguente schema:MySQL - per ogni ID nella lista selezionare 2 ultimo elemento

id, field, time 
3, 'test0', 2012-08-29 
3, 'test1', 2012-08-30 
3, 'test2', 2012-08-31 
2, 'test0', 2012-08-19 
2, 'test1', 2012-08-20 
2, 'test2', 2012-08-26 
... 

ho bisogno per ogni id nella lista trovare la sua ultima e precedenti per ultimo valore. Per esempio se gli ID = [2,3] Il risultato dovrebbe tornare

3, 'test1', 2012-08-30 
3, 'test2', 2012-08-31 
2, 'test1', 2012-08-20 
2, 'test2', 2012-08-26 

Se avrò bisogno solo ultimo valore, vorrei utilizzare

SELECT * 
FROM table 
WHERE id IN (2, 3) 
GROUP BY id 

Tutte le idee come posso raggiungere questo obiettivo?

+0

Group by darà un unico risultato per tutti gli ID. – hjpotter92

+0

si potrebbe sfruttare un 'SORT' sulla colonna del tempo combinato con una clausola' LIMIT'. –

risposta

3

Se i tuoi orari per ciascun numero ID sono unici, questo funzionerà.

SELECT d.id, d.field,d.time 
    FROM d d 
    JOIN (
    SELECT max(d.time)m, d.id 
     FROM d 
     JOIN (
     SELECT max(time) m, id 
      FROM d 
     GROUP BY id 
    )e ON d.id=e.id AND e.m>d.time 
     GROUP BY d.id 
    )e ON d.time >= e.m AND d.id = e.id 

Ecco come funziona. Questa query nidificata ottiene l'ora più recente per ciascun id.

  SELECT max(time) m, id 
      FROM d 
     GROUP BY id 

Poi, a sua volta, questo viene nidificato in questa query, che vi dà il secondo-a-ultima ora per ciascun ID (l'ultima ora del sottoinsieme di righe che escludono il tempo più recente).

SELECT max(d.time)m, d.id 
     FROM d 
     JOIN (
     SELECT max(time) m, id 
      FROM d 
     GROUP BY id 
    )e ON d.id=e.id AND e.m > d.time 

Infine, la domanda completa (mostrato prima sopra) riceve tutte le righe con tempi maggiori o uguali al tempo secondo ultime.

Se i tempi non sono univoci, ovvero se si dispone di righe in cui sono visualizzati ID e ora identici, è possibile ottenere più di due righe per ciascun ID. Ma avrai sempre le ultime due volte.

Se un ID particolare ha solo una riga, non lo otterrete.

Solo tu sai se tali limiti sono accettabili.

Go fiddle! http://sqlfiddle.com/#!2/82719/5/0

1

dare una prova

SELECT * 
    FROM table 
    WHERE id = '1' 
    ORDER BY `id` desc 
    LIMIT 0,2 
UNION 
    SELECT * 
    FROM table 
    WHERE id = '2' 
    ORDER BY `id` desc 
    LIMIT 0,2 

UPDATE:

Se può anche provare qualcosa di simile:

SELECT t1.* 
FROM `tablename` t1 
LEFT OUTER JOIN `tablename` t2 
    ON (t1.id = t2.id AND t1.time > t2.time) 
GROUP BY t1.id, t1.field, c1.time 
HAVING COUNT(*) < 2; 

Reference

Problemi correlati