2013-06-10 2 views
30

Что я хочу сделать, это SUM столбца, но и COUNT количество строк, которое он суммирует, с пределом не более 5 строк. Так что мой запрос:MySQL COUNT с LIMIT

SELECT COUNT(*), SUM(score) FROM answers WHERE user=1 LIMIT 5 

Что я ожидал назад был COUNT (*) до 5 (я не могу только предположить, что всегда будет 5 в моей логике коды, как это может иметь менее чем 5 ответов), с сумма баллов до 5 рядов.

Вместо этого я, кажется, вернусь, это общее количество совпадающих строк (где пользователь равно 1) как счетчик и сумма баллов для этих строк. Числа DonT изменить поставил ли я LIMIT 1 или LIMIT 5 или даже 50. ОГРАНИЧЕНИЕ

Что я считаю, будет работать в этой ситуации это вместо

SELECT COUNT(*), SUM(score) FROM (SELECT * FROM answers WHERE user=1 LIMIT 5) AS a 

Но это кажется немного запутанным для такого простого запроса , и, поскольку он находится в сценарии с высоким трафиком, я не буду настолько совершенным, насколько это возможно.

Я что-то не хватает? Я нашел этот отчет об ошибках несколько лет назад, который, похоже, связан с этой «проблемой» http://bugs.mysql.com/bug.php?id=50005, но я предполагаю, что это не ошибка?

+4

'LIMIT 5' вернет максимум 5 строк. 'SELECT COUNT (*), SUM (оценка) ОТ ответов' вернет 1 строку. 1 <5. У вас это правильно во втором запросе. –

+0

Yep @ ta.speot.is, думаю, мне просто нужен был кто-то, чтобы проверить, что я не делал что-то глупое. Возможно, он поклялся, что есть более простой запрос сделать то, что мне нужно, но, очевидно, нет. – Lee

+2

с использованием 'select 1' вместо' select * 'в вложенном запросе теоретически может привести к меньшему использованию памяти. –

ответ

30

Это на самом деле ваш запрос работает и является нормальным поведением. Используя LIMIT, вы не будете ограничивать счет или сумму, а только возвращаемые строки. Таким образом, ваш запрос вернет n строк, как указано в вашем предложении LIMIT. И так как ваш запрос фактически возвращает только одну строку, применение (отличное от нуля) предел не влияет на результаты.

Однако ваш второй запрос будет работать так, как ожидалось, и является установленным способом решения этой проблемы.

+0

Я отвечу на ваш ответ, как только таймер SO позволит мне. Но ты прав, думаешь, что мне просто нужен кто-то другой, чтобы объяснить это мне, поэтому я знал, что я не делаю что-то глупое. Второй запрос работает, и, похоже, это единственный способ сделать это. – Lee

+0

@ Да, это правда, я рад, что помог вам – Fabio