Creo que el problema es que HAVING se aplica después de GROUP BY, pero aún antes de la fase SELECT. Me doy cuenta de que es confuso porque la cláusula HAVING hace referencia a una columna de la declaración SELECT, pero creo que básicamente ejecuta lo que sea que esté en la declaración SELECT dos veces:una vez para tener y otra vez para SELECT.
Por ejemplo, vea esta respuesta .
Tenga en cuenta que es especialmente confuso porque si hace referencia a un nombre de columna que no aparece en la declaración SELECT en una cláusula HAVING, arrojará un error.
Por ejemplo, este violín
Pero según el violín anterior, aún le permitirá filtrar en función del resultado de una función que no aparece en la salida. Para resumir, la cláusula HAVING sigue haciendo lo que usted quiere, pero no puede filtrar un valor aleatorio y mostrarlo al mismo tiempo usando ese enfoque. Si necesita hacer eso, primero debe usar una subconsulta para corregir el valor, luego la consulta externa puede filtrar y mostrar en él.
Además, para que quede claro, probablemente valga la pena usar RAND() en la cláusula de tener, no en la parte de SQL. Aunque entiendo que esta pregunta es por qué está haciendo esto en lugar de tratar de resolver el problema específicamente.