Неправильное использование оператора 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)