Php 从数据库返回随机行而不重复

Php 从数据库返回随机行而不重复,php,mysql,Php,Mysql,我正在做一个小测验,我把问题存储在一张桌子上,每次问一个问题,我都想再问一个问题。我已尝试使用rand(): 但这些争论正在重复 还有什么我可以用来获取随机行但不会再次得到相同问题的方法吗?只需获取上一个返回行的id,并将其从以后的查询中排除即可 select * from quiz WHERE id NOT :previous_id order by rand() LIMIT 1 是的,您可以选择所有行(或其中一些行)并使用,主要是因为,ORDER BY RAND()确实对资源不友好,它实际

我正在做一个小测验,我把问题存储在一张桌子上,每次问一个问题,我都想再问一个问题。我已尝试使用
rand()

但这些争论正在重复


还有什么我可以用来获取随机行但不会再次得到相同问题的方法吗?

只需获取上一个返回行的
id
,并将其从以后的查询中排除即可

select * from quiz WHERE id NOT :previous_id order by rand() LIMIT 1

是的,您可以选择所有行(或其中一些行)并使用,主要是因为,
ORDER BY RAND()
确实对资源不友好,它实际上会重新查询表中的每一行,分配一个随机数ID,然后传递结果。

您可以使用会话和测验ID

比如说

select * from quiz order by rand() LIMIT 1
外接程序会话测验测验id:

if(!$_SESSION['quiz']) { $_SESSION['quiz'] = array(); }
$_SESSION['quiz'][] = $row['id'];
请不要打电话进来:

$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']));
...

您可以在数据库中使用
ORDER BY RAND()
或在PHP中使用
shuffle
进行随机化,两者都可以。

它们不能重复多长时间?问题的数量是否有限?您是否希望用户在看到重复的问题之前检查一次数据库中的所有问题?从性能的角度来看,使用ORDER BY RAND()语句通常是个坏主意。无论如何,如果您想使用它,只需在查询中添加分组,例如按测验id分组或其他一些唯一标识符,以消除重复项。是的,我希望用户一次检查所有问题,然后选择所有数据,然后用php洗牌结果。
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']));
...