Как правильно написать такой mysql запрос?

Рейтинг: 0Ответов: 1Опубликовано: 25.02.2015

Есть запрос вида

SELECT *, (YEAR(current_date())-YEAR(date_of_birth)) as age FROM `tbl_user` WHERE (role!="admin") GROUP BY age

Работает как надо. Вычисляет количество лет пользователей и группирует их по количеству лет. Но если я захочу посмотреть всех пользователей старше, например, 25-ти лет, то получу ошибку с описанием, что такого поля, как age, не существует. Пример:

SELECT *, (YEAR(current_date())-YEAR(date_of_birth)) as age FROM `tbl_user` WHERE (role!="admin") AND age>'25'

Подскажите, что не так, почему и как сделать, чтобы заработало? И да. Можно использовать только Mysql (никаких php и т.д.).

Ответы

▲ 2Принят

Вам нужно часть условия из WHERE перенести в HAVING. Данные, полученные через агрегацию таблицы, невозможно отфильтровать в момент выборки.

Пример:

SELECT *, (YEAR(current_date())-YEAR(date_of_birth)) as age FROM tbl_user WHERE (role!="admin") HAVING age > 25

WHERE отработает в тот момент, когда будет строиться список "не админов". В то же время будет подсчитываться возраст.
HAVING отфильтрует уже по подсчитанным данным.