Как SUM () от смещения до конца таблицы? - PullRequest
8 голосов
/ 12 апреля 2010

Если SELECT SUM(amount) FROM transactions ORDER BY order LIMIT 0, 50 суммирует поле amount для первых 50 записей в таблице, как сложить все записи после первых 50? Другими словами, я хотел бы сделать что-то вроде SELECT SUM(amount) from transactions ORDER BY order LIMIT 50, *, но это не сработает.

Ответы [ 3 ]

7 голосов
/ 12 апреля 2010
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 BY и LIMIT затем применяются к этой одной агрегированной записи, а не к записям transactions.

2 голосов
/ 12 апреля 2010

Возможно, существует более эффективный способ, но вы можете сначала выполнить запрос подсчета, чтобы получить общее количество строк в вашей таблице:

SELECT count(*) FROM transactions

Запишите это в переменную и используйте эту переменную в качестве второго аргумента для LIMIT. Возможно, вы могли бы сделать это как вложенный запрос MySQL.

2 голосов
/ 12 апреля 2010

В документации рекомендуется использовать невероятно большое число в качестве второго параметра для LIMIT:

Чтобы извлечь все строки от определенного смещения до конца набора результатов, вы можете использовать некоторое большое число для второго параметра. Этот оператор извлекает все строки от 96-й строки до последней:

SELECT * FROM tbl LIMIT 95,18446744073709551615;
...