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
答案 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索引)来指定已使用的结果。