为了生成样本数据,我试图从一个非常简单的表中随机选择一个用户。
该表只有两列,整数主键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;

10-04 21:33