我正在做一个测验,我在表格中存储问题,每次询问一个问题时,我想要显示另一个问题。我曾尝试使用rand()
:从数据库中返回随机行而不重复
select * from quiz order by rand() LIMIT 1
但行正在重复。
还有什么我可以使用的地方,我可以得到随机行,但没有再次得到相同的问题?
我正在做一个测验,我在表格中存储问题,每次询问一个问题时,我想要显示另一个问题。我曾尝试使用rand()
:从数据库中返回随机行而不重复
select * from quiz order by rand() LIMIT 1
但行正在重复。
还有什么我可以使用的地方,我可以得到随机行,但没有再次得到相同的问题?
只需获取前一个返回行的id
并将其排除在将来的查询之外。
select * from quiz WHERE id NOT :previous_id order by rand() LIMIT 1
是的,你可以选择所有的行(或其中一些),并使用shuffle()
主要是因为ORDER BY RAND()
真的是资源不友好,它实际上重新查询你的表的每一行,指定一个随机数ID然后交付结果。
您可以使用会话和测验ID。
例如
select * from quiz order by rand() LIMIT 1
加入会话测验测验ID:
if(!$_SESSION['quiz']) { $_SESSION['quiz'] = array(); }
$_SESSION['quiz'][] = $row['id'];
和NOT拨打:
$session = implode(", ", $_SESSION['quiz']);
$query = "select * from quiz WHRE `id` NOT IN (".$session.") order by rand() LIMIT 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']));
...
你可以使用shuffle
使用ORDER BY RAND()
或PHP无论是在数据库中随机化,无论是罚款。
多久才能重复?是否有数量有限的问题?您是否希望用户在查看重复内容之前查看数据库中的所有问题? – deceze
从性能角度来看,使用ORDER BY RAND()语句通常是个坏主意。无论如何,如果你想使用它,只需在你的查询中添加分组,例如GROUP BY quiz_id或其他一些唯一标识符,以摆脱重复。 – bodi0
是的,我想用户通过所有问题一次 –