从枚举行

时间:2016-11-17 18:37:36

标签: mysql random row

我在Mysql中有一个自动递增ID的表。我总是添加到这个表,永远不会删除并将ID值设置为NULL,以便我很确定没有漏洞。这是表结构:

CREATE TABLE mytable(      id smallint(5)unsigned NOT NULL AUTO_INCREMENT,      data1 varchar(200)DEFAULT NULL,      data2 varchar(30)DEFAULT NULL,      PRIMARY KEY(id),      独特的钥匙datadata1data2)    )

我想从表格中随机选取一行。我正在使用这个:

select * from mytable where id=(select floor(1 + rand() * ((select max(id) from mytable) - 1)));

但有时候我什么都没得到,有时候是一排,有时候是两排。用count(*)或count(id)替换max(id)没有帮助。我理解这可能是因为对每行评估了rand()。正如a similar question中所建议的那样,我使用了这个查询:

select * from mytable cross join (select @rand := rand()) const where id=floor(1 + @rand*((select count(*) from mytable)-1));

但有时候我仍然会得到一个空位。同样如此:

select * from mytable cross join (select @rand := rand()) const where id=floor(@rand*(select count(*) from mytable)+1);

我正在寻找一种快速的方法来做到这一点,因此它不会花很长时间在大桌子上。 ORDER BY rand()LIMIT 1对我来说不是一个选项。不能用一个查询完成,可以吗?

0 个答案:

没有答案