Uw code retourneert meerdere rijen omdat rand()
wordt op elke rij geëvalueerd. Je hebt dus de mogelijkheid om meerdere matches te maken. En kans op helemaal geen matches.
Je kunt je idee gebruiken, maar probeer het op deze manier:
select relusers.uname
from relusers cross join
(selext @rand := rand()) const
where relusers.users_id = floor(@rand*46+1);
Dit genereert slechts één willekeurige waarde en dus slechts één rij. Maar met slechts 46 rijen is de order by
methode zou goed genoeg moeten presteren:
select relusers.uname
from relusers
order by rand()
limit 1;