从 200 个数字中随机选择一个包含 30 个数字的块


Select a random chunk of 30 numbers from 200 numbers

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

只需将ORDER BY RAND()添加到查询中即可。它是"充分"随机的。

 SELECT FOO FROM BAR ORDER BY RAND() LIMIT 30

使用 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);

上述对密钥的查询可以缓存在 PHP 中,因此可以用于更频繁的请求。但是,当您的表在 100k 或更大的范围内时,我建议以随机顺序创建一个单独的表,其中包含图像 ID,您可以将其与图像表联接。您可以使用 ORDER BY RAND() 每天填充一次或几次。

我建议使用PHP的array_rand()

http://php.net/manual/en/function.array-rand.php

将您想要选择的任何内容放入数组中,让它为您选择 20 个条目。 然后,您可以使用所需的任何文件名,而不必依赖它们的数字顺序。