从200个数字中选择30个数字的随机数据块

时间:2012-08-16 02:39:38

标签: php mysql

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

3 个答案:

答案 0 :(得分:3)

只需在查询中添加ORDER BY RAND()即可。它“足够”随机。

 SELECT FOO FROM BAR ORDER BY RAND() LIMIT 30

答案 1 :(得分:2)

使用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或更高的范围内时,我建议您以随机顺序创建一个单独的表格,其中您可以加入图像表格。您可以使用ORDER BY RAND()每天填充一次或几次。

答案 2 :(得分:1)

我建议使用PHP的array_rand()

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

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