Myślę, że problem polega na tym, że HAVING jest stosowane po GROUP BY, ale jeszcze przed fazą SELECT. Zdaję sobie sprawę, że jest to mylące, ponieważ klauzula HAVING odwołuje się do kolumny z instrukcji SELECT, ale myślę, że po prostu wykonuje to, co jest w instrukcji SELECT dwa razy - raz za posiadanie, a potem ponownie za SELECT.
Na przykład zobacz tę odpowiedź .
Zauważ, że jest to szczególnie mylące, ponieważ jeśli odwołasz się do nazwy kolumny, która nie pojawia się w instrukcji SELECT w klauzuli HAVING, spowoduje to zgłoszenie błędu.
Np. te skrzypce
Ale zgodnie z powyższymi skrzypkami nadal pozwoli ci faktycznie filtrować na podstawie wyniku funkcji, która nie pojawia się w danych wyjściowych. Krótko mówiąc, klauzula HAVING nadal robi to, co chcesz, ale nie możesz jednocześnie filtrować losowej wartości i wyświetlać jej w tym samym czasie przy użyciu tego podejścia. Jeśli musisz to zrobić, musisz najpierw użyć podzapytania, aby naprawić wartość, a następnie zewnętrzne zapytanie może je filtrować i wyświetlać.
Ponadto, aby było jasne, prawdopodobnie warto użyć RAND() w klauzuli have, a nie w części SQL. Chociaż rozumiem, że to pytanie dotyczy dlaczego robi to, a nie próbuje rozwiązać problem konkretnie.