テーブルの質問に保存したクイズを作成しています。1 つの質問が表示されるたびに、別の質問を表示したいと考えています。私は使用してみましたrand()
:
select * from quiz order by rand() LIMIT 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";
以前に返された行を取得し、id
将来のクエリから除外するだけです。
select * from quiz WHERE id NOT :previous_id 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']));
...
ORDER BY RAND()
を使用してデータベースで、または を使用して PHPでランダム化を行うことができます。どちらでも問題ありませんshuffle
。
はい、すべての行 (またはそれらの一部) を選択して使用することができます。shuffle()
主な理由ORDER BY RAND()
は、実際にはリソースに優しくなく、実際にテーブルの各行を再クエリし、乱数 ID を割り当ててから結果を配信するためです。