2010-04-08 11 views
29

Diciamo che ho il seguente tabella del database:Ottieni le ultime N file nel database in ordine?

record_id | record_date | record_value 
-----------+-------------+-------------- 
     1 | 2010-05-01 |  195.00 
     2 | 2010-07-01 |  185.00 
     3 | 2010-09-01 |  175.00 
     4 | 2010-05-01 |  189.00 
     5 | 2010-06-01 |  185.00 
     6 | 2010-07-01 |  180.00 
     7 | 2010-08-01 |  175.00 
     8 | 2010-09-01 |  170.00 
     9 | 2010-10-01 |  165.00 

voglio afferrare gli ultimi 5 righe con i dati in ordine di record_date ASC. Questo è facile da fare con:

SELECT * FROM mytable ORDER BY record_date ASC LIMIT 5 OFFSET 4 

Il che mi avrebbe dato:

record_id | record_date | record_value 
-----------+-------------+-------------- 
     6 | 2010-07-01 |  180.00 
     7 | 2010-08-01 |  175.00 
     3 | 2010-09-01 |  175.00 
     8 | 2010-09-01 |  170.00 
     9 | 2010-10-01 |  165.00 

Ma come faccio a fare questo quando non so quanti record ci sono e non posso calcolare la magia numero di 4?

ho provato questa domanda, ma se ci sono meno di 5 record, si traduce in un offset negativo, che non è valido:

SELECT * FROM mytable ORDER BY record_date ASC LIMIT 5 
    OFFSET (SELECT COUNT(*) FROM mytable) - 5; 

così come faccio a ottenere questo risultato?

risposta

58

Perché non ordinate il contrario?

SELECT * FROM mytable ORDER BY record_date DESC LIMIT 5; 

Se non si desidera capovolgere di nuovo correttamente nell'applicazione, è possibile nidificare una query e capovolgere due volte:

SELECT * 
    FROM (SELECT * FROM mytable ORDER BY record_date DESC LIMIT 5) 
    ORDER BY record_date ASC; 

... che si rivela essere un'operazione piuttosto a buon mercato .

+1

Per la prima query: perché io non voglio avere a ordinare nell'applicazione. Per la seconda query: ha funzionato perfettamente, ma non si adatta bene al mio DAL. Oh bene. Grazie! – Kristopher

+1

@Travis La seconda query restituisce un errore. La query nidificata deve essere seguita da un'istruzione AS [nome_interrogazione] prima di ORDINARE DA –

+1

@AndyStowAway: questa potrebbe essere una limitazione della tua implementazione. Sono abbastanza sicuro che le subquery anonime sono a posto (so che funzionano in Postres e MySQL). –

9

Questo dovrebbe funzionare:

WITH t AS (
    SELECT * FROM mytable ORDER BY record_date DESC LIMIT 5 
) 
SELECT * FROM t ORDER BY record_date ASC; 
+0

sì, questo è un ottimo supplemento per il flip back. Grazie! – zerocog

Problemi correlati