我正在做一個測驗,我在表格中存儲問題,每次詢問一個問題時,我想要顯示另一個問題。我曾嘗試使用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
是的,我想用戶通過所有問題一次 –