2010-04-12 16 views
8

Se SELECT SUM(amount) FROM transactions ORDER BY order LIMIT 0, 50 somma il campo amount per i primi 50 record in una tabella, come si fa una somma di tutti i record dopo il i primi 50? In altre parole, mi piacerebbe fare qualcosa come SELECT SUM(amount) from transactions ORDER BY order LIMIT 50, *, ma questo non funziona.Come SUM() da un offset attraverso la fine della tabella?

risposta

2

I documentation consigli per utilizzare un gran numero incredibile come secondo parametro a LIMIT:

Per recuperare tutte le righe da una certa compensazione fino alla fine del set di risultati, è possibile utilizzare alcuni gran numero per la secondo parametro. Questa dichiarazione recupera tutte le righe dalla fila 96 ° per l'ultimo:

SELECT * FROM tbl LIMIT 95,18446744073709551615; 
+0

Accettando questo, poiché si rivolge direttamente alla mia domanda, ma grazie (e +1) a @Quassnoi per aver segnalato il mio problema con 'ORDER BY', – keithjgrant

+0

Il formato di questa risposta restituirebbe zero risultati se SUM o alcuni sono state utilizzate altre funzioni di aggregazione. Questo perché, come spiega @Quassnoi di seguito, la SUM verrà applicata ai record n. 95 - LARGE_NUMBER di una sottoquery che ha restituito solo un risultato. Quassnoi fornisce la risposta corretta alla domanda originale di seguito. – akgill

7
SELECT SUM(amount) 
FROM (
     SELECT amount 
     FROM transactions 
     ORDER BY 
       order 
     LIMIT 50, 1000000000000 
     ) q 

Nota che la query originale:

SELECT SUM(amount) 
FROM transactions 
ORDER BY 
     order 
LIMIT 0, 50 

non fa quello che probabilmente pensate lo fa. E 'sinonimo di questo:

SELECT a_sum, order 
FROM (
     SELECT SUM(amount) AS a_sum, order 
     FROM transactions 
     ) q 
ORDER BY 
     order 
LIMIT 0, 50 

La query interna (che normalmente fallire in qualsiasi altro motore, ma lavora a MySQL a causa della sua sintassi estensione GROUP BY) restituisce solo 1 record.

ORDER BY e LIMIT vengono quindi applicati a tale record aggregato, non ai record di transactions.

+0

Cosa succede se si dispone di più di 1000000000000 righe? – Pyrolistical

+0

Qualche motivo per la sottoquestione? Sembra ridondante. – keithjgrant

+0

@Pirolico: quindi consideri di passare a un altro motore. – Quassnoi

2

C'è probabilmente un modo più efficiente, ma si potrebbe eseguire una query conteggio prima, per recuperare # totale di righe nella tabella:

SELECT count(*) FROM transactions 

Stuff in una variabile e utilizzare tale variabile come secondo argomento per LIMIT. Probabilmente potresti farlo come una query mysql annidata.

Problemi correlati