4

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

4

3 回答 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 回答