Вашият код връща няколко реда, защото rand()
се оценява на всеки ред. И така, имате промяна на множество съвпадения. И шанс изобщо да няма съвпадения.
Можете да използвате идеята си, но опитайте по следния начин:
select relusers.uname
from relusers cross join
(selext @rand := rand()) const
where relusers.users_id = floor(@rand*46+1);
Това генерира само една произволна стойност и следователно само един ред. Но само с 46 реда order by
методът трябва да работи достатъчно добре:
select relusers.uname
from relusers
order by rand()
limit 1;