Ваша логика запроса просто отключена.У вас есть GROUP BY
использование разных неагрегированных столбцов в SELECT
.В HAVING
есть столбцы, которые не агрегированы и не в GROUP BY
.MySQL расширяет свой синтаксис, чтобы позволить это.Однако запрос (и результаты) не имеют смысла.
Ваш запрос должен выглядеть следующим образом:
select sum(total_hours) as hours, year(task_completion) as year
from task_details
where project_type_id = 10
group by year
having year = 2018;
В чем разница?Примечание:
- Сравнение для
project_type_id
содержится в предложении WHERE
до агрегации , а не после агрегации. - Предложение
GROUP BY
содержитнеагрегированные столбцы из SELECT
. year
- это число, поэтому сравнение проводится с числом, а не строкой.
Я бы посоветовал вам сделать все сравнения перед агрегацией - поэтому не требуется having
:
select sum(total_hours) as hours,
year(task_completion) as year
from task_details
where project_type_id = 10 and
task_completion >= '2018-01-01' and
task_completion < '2019-01-01'
group by year;
Обратите внимание, что в этой версии не используется year()
.Функции на столбцах могут препятствовать использованию индексов.Эта версия может использовать индекс на (project_type_id, task_completion)
.