为了生成样本数据,我试图从一个非常简单的表中随机选择一个用户。
该表只有两列,整数主键users_id
包含1到46之间的所有值,而uname
是一个varchar(60)
。
询问
select relusers.uname from relusers where relusers.users_id=floor(rand()*46+1);
正在返回多行。也许我已经盯着这个问题看太久了,但是我不明白上面的查询怎么可能返回多行。floor()返回一个正与主键列进行比较的整数。在选择中包含用户id将显示正在选择的多个不同的id。结果我可以理解为零行,但是多行呢?有什么想法吗?
最佳答案
您的代码返回多行,因为对每行计算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;