目前我正在尝试做的是从一组 200 个数字中获取一大块 30 个数字。例如,由于这将与 MySQL 一起使用,我想从 200 个图像的数据库中选择 30 个随机图像。我希望能够在 limit 语句中使用两个数字(一个高和低),这将返回 30 行数据,如下所示:SELECT * FROM 'images' LIMIT 20,50
或SELECT * FROM 'images' LIMIT 10,40
. 我知道这可能听起来像是一个愚蠢的问题,尽管我的大脑现在有点难过。非常感谢所有帮助!谢谢 :)
问问题
261 次
3 回答
3
只需添加ORDER BY RAND()
到您的查询。它是“足够”随机的。
SELECT FOO FROM BAR ORDER BY RAND() LIMIT 30
于 2012-08-16T02:42:01.703 回答
2
UsingORDER 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()
.
于 2012-08-16T02:53:52.857 回答
1
我建议使用 PHP 的array_rand()
.
http://php.net/manual/en/function.array-rand.php
把你想选择的任何东西放在一个数组中,让它为你挑选 20 个条目。然后,您可以使用所需的任何文件名,而不必依赖它们按数字顺序排列。
于 2012-08-16T02:41:31.890 回答