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
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;
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
.
Cosa succede se si dispone di più di 1000000000000 righe? – Pyrolistical
Qualche motivo per la sottoquestione? Sembra ridondante. – keithjgrant
@Pirolico: quindi consideri di passare a un altro motore. – Quassnoi
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.
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
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