2012-10-02 55 views
4

我正在做一个测验,我在表格中存储问题,每次询问一个问题时,我想要显示另一个问题。我曾尝试使用rand()从数据库中返回随机行而不重复

select * from quiz order by rand() LIMIT 1 

但行正在重复。

还有什么我可以使用的地方,我可以得到随机行,但没有再次得到相同的问题?

+1

多久才能重复?是否有数量有限的问题?您是否希望用户在查看重复内容之前查看数据库中的所有问题? – deceze

+0

从性能角度来看,使用ORDER BY RAND()语句通常是个坏主意。无论如何,如果你想使用它,只需在你的查询中添加分组,例如GROUP BY quiz_id或其他一些唯一标识符,以摆脱重复。 – bodi0

+0

是的,我想用户通过所有问题一次 –

回答

1

只需获取前一个返回行的id并将其排除在将来的查询之外。

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

是的,你可以选择所有的行(或其中一些),并使用shuffle()主要是因为ORDER BY RAND()真的是资源不友好,它实际上重新查询你的表的每一行,指定一个随机数ID然后交付结果。

1

您可以使用会话和测验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"; 
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无论是在数据库中随机化,无论是罚款。