Документация кажется довольно ясной по этому поводу. Но позвольте мне посмотреть, смогу ли я объяснить вам это лучше.
Предложение HAVING
по сути является предложением WHERE
, которое «имеет место» после GROUP BY
. То есть агрегация уже произошла, поэтому доступны данные агрегированные данные.
В вашем примере агрегация не возвращает Author_Id
. И MySQL не знает, как его сгенерировать.
Однако COUNT(w.Author_Id)
- это агрегированный результат. MySQL может просто добавить это (концептуально) к результатам, возвращаемым агрегацией, и отфильтровать их.
Ваш запрос эквивалентен:
SELECT Title, Isbn
FROM (SELECT b.Title, b.Isbn, COUNT(*) as cnt
FROM Book b JOIN
Writing w
ON w.Book_id = b.ID
GROUP BY b.ID
) b
WHERE cnt > 1 AND b.Title LIKE '%Head%';
Тем не менее, запрос лучше записать как:
SELECT b.Title, b.Isbn
FROM Book b JOIN
Writing w
ON w.Book_id = b.ID
WHERE b.Title LIKE '%Head%'
GROUP BY b.ID
HAVING COUNT(*) > 1;
Вы можете фильтровать по title
до агрегирования, что обычно намного эффективнее.