2010-04-12 51 views
8

如果SELECT SUM(amount) FROM transactions ORDER BY order LIMIT 0, 50總和爲amount字段爲前50個記錄中的一個表,怎麼總算之後所有記錄總和爲第50個?換句話說,我想要做一些類似於SELECT SUM(amount) from transactions ORDER BY order LIMIT 50, *的工作,但這不起作用。如何從表中的偏移量結束SUM()?

回答

2

documentation建議使用一個令人難以置信的大量的第二個參數爲LIMIT

從某個檢索所有行偏移到結果集的末尾,你可以使用的一些大量第二個參數。此語句檢索從第96行中的所有行到最後:

SELECT * FROM tbl LIMIT 95,18446744073709551615; 
+0

接受這一個,因爲它最直接地解決我的問題,但是感謝(和+1)@Quassnoi指出我的問題與'ORDER BY'一起 – keithjgrant 2010-04-12 20:34:55

+0

這個答案的格式將返回零結果如果SUM或一些其他聚合功能被使用。這是因爲,正如@Quassnoi在下面解釋的那樣,SUM將應用於僅返回一個結果的子查詢的記錄#95 - LARGE_NUMBER。 Quassnoi給出了以下原始問題的正確答案。 – akgill 2014-04-28 21:00:27

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

請注意,您的原始查詢:

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

沒有做什麼,你可能認爲它。這是同義的:

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

內部查詢(這通常無法在任何其他的引擎,但在MySQL由於其GROUP BY擴展語法工程)只返回1記錄。

ORDER BYLIMIT然後應用於該一個彙總記錄而不是transactions的記錄。

+0

如果你有超過10000000000行? – Pyrolistical 2010-04-12 17:05:12

+0

子查詢的任何原因?似乎多餘。 – keithjgrant 2010-04-12 17:40:44

+0

@Pyrolistical:那麼你考慮切換到另一個引擎。 – Quassnoi 2010-04-12 17:55:20

2

有可能是一個更有效的方式,但你可以先運行一個計數查詢,檢索行的總#在你的餐桌:

SELECT count(*) FROM transactions 

將這些變成變量並將該變量用作LIMIT的第二個參數。你可以做一個嵌套的mysql查詢。