Неправильное использование оператора GROUP BY после предложения WHERE

Следующий запрос успешно возвращает определенных пользователей (по идентификатору), которые напечатали больше всего:

SELECT file_prints.user_id, user.major, sum(print_pages) FROM `file_prints`
INNER JOIN `user` on file_prints.user_id = user.user_id GROUP BY
file_prints.user_id 
ORDER BY sum(print_pages)

Когда я ввожу предложение where, чтобы попытаться исключить пользователей, которые вообще не печатали (то есть где sum(print_pages) == 0), я пишу следующий запрос:

SELECT file_prints.user_id, user.major, sum(print_pages) FROM `file_prints`
INNER JOIN `user` on file_prints.user_id = user.user_id WHERE
sum(print_pages) > 0 GROUP BY file_prints.user_id 
ORDER BY sum(print_pages)

и получите следующую ошибку:

 #1111 - Invalid use of group function 

Как я могу исключить результаты, которые имеют 0 для суммы (print_pages)?

2 ответа

Решение

Это потому, что вы не можете использовать агрегатную функцию с WHERE пункт. Итак, используйте HAVING пункт, как это:

SELECT file_prints.user_id, user.major, sum(print_pages) 
FROM `file_prints`
INNER JOIN `user` on file_prints.user_id = user.user_id
GROUP BY file_prints.user_id
HAVING sum(print_pages) > 0 
ORDER BY sum(print_pages)

Вместо этого вам нужно использовать ключевое слово Имея, когда вы работаете с агрегатом:

SELECT file_prints.user_id, user.major, sum(print_pages) FROM `file_prints`
INNER JOIN `user` on file_prints.user_id = user.user_id 
GROUP BY file_prints.user_id 
HAVING sum(print_pages) > 0 
ORDER BY sum(print_pages)
Другие вопросы по тегам