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

时间:2012-10-02 07:04:58

标签: php mysql

我正在进行测验,我将其存储在一个表格问题中,每次询问一个问题时,我想要显示另一个问题。我尝试过使用rand()

select * from quiz order by rand() LIMIT 1

但行正在重复。

还有什么我可以使用的地方,我可以获得随机行但又没有得到同样的问题吗?

4 个答案:

答案 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,然后传递结果。