我正在进行测验,我将其存储在一个表格问题中,每次询问一个问题时,我想要显示另一个问题。我尝试过使用rand()
:
select * from quiz order by rand() LIMIT 1
但行正在重复。
还有什么我可以使用的地方,我可以获得随机行但又没有得到同样的问题吗?
答案 0 :(得分:1)
只需获取上一个返回行的id
,并将其从以后的查询中排除。
select * from quiz WHERE id NOT :previous_id order by rand() LIMIT 1
答案 1 :(得分:1)
您可以使用会话和您的测验ID。
例如
select * from quiz order by rand() LIMIT 1
在会话测验中添加测验ID:
if(!$_SESSION['quiz']) { $_SESSION['quiz'] = array(); }
$_SESSION['quiz'][] = $row['id'];
并致电NOT IN:
$session = implode(", ", $_SESSION['quiz']);
$query = "select * from quiz WHRE `id` NOT IN (".$session.") order by rand() LIMIT 1";
答案 2 :(得分:1)
如果您要求用户以随机顺序浏览所有问题,则必须为每个用户跟踪单个“播放列表”。最好使用会话:
session_start();
if (!$_SESSION['ids']) {
$_SESSION['ids'] = $db->getAllQuestionIdsFromTheDatabase();
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// Leaving this up to you.
shuffle($_SESSION['ids']);
// $_SESSION['ids'] should now look like array(42, 12, 75, ...);
}
$question = $db->getQuestionById(array_shift($_SESSION['ids']));
...
您可以使用ORDER BY RAND()
在数据库中进行随机化,也可以使用shuffle
在PHP中进行随机化,也可以。
答案 3 :(得分:0)
是的,您可以选择所有行(或其中一些行)并使用shuffle()
主要是因为ORDER BY RAND()
确实是资源不友好并且它实际上重新查询每一行你的表格,分配一个随机数字ID,然后传递结果。