Din kod returnerar flera rader eftersom rand()
utvärderas på varje rad. Så du har ändringen av flera matcher. Och en chans att inga matcher alls.
Du kan använda din idé, men prova den så här:
select relusers.uname
from relusers cross join
(selext @rand := rand()) const
where relusers.users_id = floor(@rand*46+1);
Detta genererar bara ett slumpmässigt värde och därmed bara en rad. Men med bara 46 rader, order by
metoden bör fungera tillräckligt bra:
select relusers.uname
from relusers
order by rand()
limit 1;