Su código devuelve varias filas porque rand()
se evalúa en cada fila. Entonces, tienes el cambio de múltiples partidos. Y la posibilidad de que no haya ninguna coincidencia.
Puedes usar tu idea, pero pruébalo de esta manera:
select relusers.uname
from relusers cross join
(selext @rand := rand()) const
where relusers.users_id = floor(@rand*46+1);
Esto genera solo un valor aleatorio y, por lo tanto, solo una fila. Pero, con solo 46 filas, el order by
el método debería funcionar lo suficientemente bien:
select relusers.uname
from relusers
order by rand()
limit 1;