随机随机播放没有再次得到相同的结果

时间:2013-06-04 21:43:45

标签: php mysql

id    |  photo title     |  created_date

33 |  my family       |  2009 8 04
44  |  friends group   |  2009 4 05
55  |  beautiful place |  2009 3 06
66  |  working late    |  2009 11 07 

我将结果随机化并限制为1.说我有身份55。如果没有得到我再次得到的结果,我怎么能得到下一行呢?

这是主页的查询

  

SELECT * FROM data ORDER BY rand()LIMIT 1

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

  

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

3 个答案:

答案 0 :(得分: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()
...

the mysql manual中详细了解种子RAND()

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

答案 1 :(得分:0)

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

$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() 

答案 2 :(得分:0)

嗯,一个选项是提供你在where子句中选择的结果:

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

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

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