Мисля, че проблемът е, че HAVING се прилага след GROUP BY, но все още преди фазата SELECT. Осъзнавам, че е объркващо, защото клаузата HAVING препраща към колона от оператора SELECT, но мисля, че по същество просто изпълнява всичко, което е в оператора SELECT, два пъти - веднъж за притежаването и след това отново за SELECT.
Например вижте този отговор .
Забележете, това е особено объркващо, защото ако се позовавате на име на колона, което не се появява в израза SELECT в клауза HAVING, това ще доведе до грешка.
Например тази цигулка
Но според тази цигулка по-горе, тя все пак ще ви позволи да филтрирате въз основа на резултата от функция, която не се появява в изхода. Накратко, клаузата HAVING все още прави това, което искате, но не можете едновременно да филтрирате произволна стойност и да я покажете едновременно, като използвате този подход. Ако трябва да направите това, първо трябва да използвате подзаявка, за да фиксирате стойността, след което външната заявка може да филтрира и показва върху нея.
Освен това, за да стане ясно, вероятно си струва просто да използвате RAND() в клаузата за име, а не в SQL частта. Въпреки че разбирам, че този въпрос пита защо прави това, вместо да се опитва конкретно да реши проблема.