Seu código está retornando várias linhas porque
rand()
é avaliado em cada linha. Então, você tem a mudança de várias correspondências. E uma chance de nenhuma partida. Você pode usar sua ideia, mas tente desta forma:
select relusers.uname
from relusers cross join
(selext @rand := rand()) const
where relusers.users_id = floor(@rand*46+1);
Isso gera apenas um valor aleatório e, portanto, apenas uma linha. Mas, com apenas 46 linhas, o
order by
método deve funcionar bem o suficiente:select relusers.uname
from relusers
order by rand()
limit 1;