我在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
),
独特的钥匙data
(data1
,data2
)
)
我想从表格中随机选取一行。我正在使用这个:
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对我来说不是一个选项。不能用一个查询完成,可以吗?