2012-10-02 54 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無論是在數據庫中隨機化,無論是罰款。