这应该有助于:
Select *
from table1 inner join
table2
on table1.in = table2.in
where table1.T = A and rand() < 1000.0/20000.0
order by rand()
limit 500
这将在提取 500 个随机样本之前将结果集限制为大约 1000 个随机行。获得比预期更多的行的目的只是为了确保您获得足够大的样本量。
这是一种替代策略,建立在“创建自己的索引”方法的基础上。
使用以下查询创建一个临时表:
create temporary table results as
(Select *, @rn := @rn + 1 as rn
from table1 inner join
table2
on table1.in = table2.in cross join
(select @rn := 0) const
where table1.T = A
);
您现在有一个行号列。并且,您可以使用以下命令返回行数:
select @rn;
然后你可以在你的应用程序中生成 id。
我倾向于使用以下两个查询将处理保留在数据库中:
create temporary table results as
(Select *, @rn := @rn + 1 as rn, rand() as therand
from table1 inner join
table2
on table1.in = table2.in cross join
(select @rn := 0) const
where table1.T = A
);
select *
from results
where therand < 1000/@rn
order by therand
limit 500;