Php 从200个数字中随机选择30个数字

Php 从200个数字中随机选择30个数字,php,mysql,Php,Mysql,目前我想做的是从一组200个数字中得到一组30个数字。例如,由于这将用于MySQL,我想从200个图像的数据库中随机选择30个图像。我希望能够在limit语句中使用两个数字(高和低),它们将返回30行数据,如下所示:SELECT*FROM'images'limit 20,50或SELECT*FROM'images'limit 10,40。我知道这听起来可能是个愚蠢的问题,尽管我的大脑现在有点困惑。非常感谢您的帮助!谢谢:)我建议使用PHP的array\u rand() 把你想从中选择的东西放在

目前我想做的是从一组200个数字中得到一组30个数字。例如,由于这将用于MySQL,我想从200个图像的数据库中随机选择30个图像。我希望能够在limit语句中使用两个数字(高和低),它们将返回30行数据,如下所示:
SELECT*FROM'images'limit 20,50
SELECT*FROM'images'limit 10,40
。我知道这听起来可能是个愚蠢的问题,尽管我的大脑现在有点困惑。非常感谢您的帮助!谢谢:)

我建议使用PHP的
array\u rand()


把你想从中选择的东西放在一个数组中,让它为你挑选20个条目。然后,您可以使用您想要的任何文件名,而不必依赖于它们的数字顺序。

只需将
order BY RAND()
添加到查询中即可。它是“足够”随机的

使用
orderbyrand()
被认为是一种反模式,因为您强制数据库执行完整表扫描和昂贵的排序操作

要从查询缓存中获益,您可以使用以下混合解决方案:

// take all image ids
$keys = $db->query('SELECT image_id FROM images')->fetchALL(PDO::FETCH_COLUMN, 0);

// pick 30
$random_keys = join(',', array_rand(array_flip($keys), 30));

// query those images only
$values = $db->query("SELECT * FROM images WHERE image_id IN ($random_keys)")->fetchAll(PDO::FETCH_ASSOC);

上面的密钥查询可以缓存在PHP中,因此可以用于更频繁的请求但是,当您的表在100k或更大范围内时,我建议您创建一个单独的表,其中包含随机顺序的图像ID,您可以根据图像表加入。您可以使用
orderbyrand()

每天填充一次或几次。请注意,这是一个PHP解决方案。这就是你的问题的标签。如果您想要一个SQL解决方案,请以Burhan的例子为例。图像的数量会显著增加到200以上吗?这个数据经常被请求吗?是的,它会增长,因为我将使用
num_rows
来代替200。order by rand()是一种反模式,所以不应该三思而后行。是否
从'images'order by rand()中选择30从图像表中随机选择30张图像,然后?感谢@Brad的编辑。从我的手机回复,编辑选项非常有限。没问题@scjosh,你需要一个
LIMIT
子句
从图像中选择一些字段,按RAND排序()限制30
。从长远来看,这会比使用
$query=“从“图像”中选择*按RAND排序()限制30;”更快吗我唯一担心的是,当数据库变大时,查询将需要更长的时间来执行。@scjosh使用
ORDER BY RAND()
将强制执行完整的表扫描和手动排序,因此如果您的表变大,并且您需要经常(即在每次请求时)访问此信息,我的方法会更好,因为您可以在php中缓存图像ID。@scjosh当您的表增长超过几个100k行时,您应该考虑使用随机键创建一个单独的表,您可以对图像表进行连接;您可以每天使用order by rand()构建表,因为它只运行一次:)这是个好主意。现在我只使用order by rand(),但将来我会像你说的那样有一个单独的表,并为这些随机图像选框。
// take all image ids
$keys = $db->query('SELECT image_id FROM images')->fetchALL(PDO::FETCH_COLUMN, 0);

// pick 30
$random_keys = join(',', array_rand(array_flip($keys), 30));

// query those images only
$values = $db->query("SELECT * FROM images WHERE image_id IN ($random_keys)")->fetchAll(PDO::FETCH_ASSOC);