0
编号 | 照片标题 | 创建日期

33 | 我的家人 | 2009 8 04
44 | 朋友圈 | 2009 4 05
55 | 美丽的地方| 2009 年 3 月 06 日
66 | 工作到很晚 | 2009年11月07日

我将我的结果随机化并限制为 1。假设我有 id 55。如果没有再次获得结果,我将如何获得下一行?

这是主页的查询

SELECT * FROM data ORDER BY rand() LIMIT 1

对于接下来的页面,我可能会再次得到相同的结果

SELECT * FROM data WHERE id > $n ORDER BY rand() LIMIT 1

4

3 回答 3

3

重用您在 PHP 中生成的种子。

伪代码:

$seed = rand()
$stmt = $mysqli->prepare("SELECT * FROM data ORDER BY RAND(?) LIMIT 1");
$stmt->bind_param($seed);
$stmt->execute()
...

然后当您需要其余行时:

$stmt = $mysqli->prepare("SELECT * FROM data ORDER BY RAND(?) LIMIT 2,1000");
$stmt->bind_param($seed);
$stmt->execute()
...

RAND()mysql 手册中查看有关播种的更多信息。

这种方法的优点是您可以显示任意数量的页面,而无需跟踪最初生成的种子(当然还有您所在的页面)之外的任何内容。

于 2013-06-04T21:55:00.490 回答
0

好吧,一种选择是提供您已经在 where 子句中选择的结果:

SELECT * FROM data WHERE `id` NOT IN ('the', 'ids', 'you', 'already', 'selected', ...) ORDER BY rand() LIMIT 1

NOT IN然而,随着越来越多的“使用的 id”被添加到列表中,这种方法将很快变得低效。在处理随机结果时,这始终是一个问题。

您可能需要考虑将使用的 id 值存储在单独的表中,并使用该表的内容(可能由 user_id 索引)来指定已使用的结果。

于 2013-06-04T21:49:45.030 回答
0

你没有写你使用什么引擎。假设它是 pdo,您可以在结果上使用 fetchAll() 并通过 $_SESSION 将 fetchAll() 的结果传递给会话;

$sth = $dbh->prepare("SELECT * FROM data ORDER BY rand() ");
$sth->execute();
$_SESSION['rnd_res'] = $sth->fetchAll();

如果你写LIMIT 1,将没有其他记录,只有一个。您还可以记住最后一个 id 或一组 id 并写入

SELECT * FROM data WHERE id<>$last_id ORDER BY rand() 

这将排除您使用的最后一个 id,这个 id 也可以存储在其中$_SESSION

结果组的最后一个选项可能NOT IN()在查询中;

SELECT * FROM data WHERE id NOT IN($array_of_last_ids) ORDER BY rand() 
于 2013-06-04T21:49:00.550 回答