問題は、HAVINGがGROUP BYの後で、まだSELECTフェーズの前に適用されることだと思います。 HAVING句がSELECTステートメントの列を参照しているため、混乱していることに気付きましたが、基本的には、SELECTステートメントにあるものを2回実行するだけだと思います。
たとえば、この回答 をご覧ください 。
HAVING句のSELECTステートメントに表示されない列名を参照すると、エラーがスローされるため、特に混乱を招くことに注意してください。
例:このフィドル
ただし、上記のフィドルのように、出力に表示されない関数の結果に基づいて実際にフィルタリングすることもできます。簡単に言うと、HAVING句はまだ希望どおりの動作をしていますが、ランダムな値でフィルタリングすると同時に、そのアプローチを使用して表示することはできません。それを行う必要がある場合は、最初にサブクエリを使用して値を修正する必要があります。その後、外部クエリでフィルタリングして表示できます。
また、明確にするために、SQL部分ではなく、have句でRAND()を使用するだけの価値があると思われます。この質問はなぜを尋ねていると思いますが 問題を具体的に解決しようとするのではなく、これを行っています。