目前我要做的是从一组200中获取一大块30个数字。例如,因为这将与MySQL一起使用,我想从200个图像的数据库中选择30个随机图像。我希望能够在limit语句中使用两个数字(高和低),这将返回30行数据,如:SELECT * FROM 'images' LIMIT 20,50
或SELECT * FROM 'images' LIMIT 10,40
。我知道这可能听起来像一个愚蠢的问题,虽然我的大脑现在只是有点难过。非常感谢所有帮助!谢谢:))
答案 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个条目。然后,您可以使用您想要的任何文件名,而不必依赖于它们的数字顺序。