web-dev-qa-db-ja.com

mysqlからランダムで一意のレコードを選択する方法(php言語)

私のデータベースには、次の列で構成される質問テーブルがあります

  1. question numberは1〜150の範囲です。
  2. question text
  3. text for 4 options A、B、C、およびDとして
  4. answer option(a、b、cまたはdのいずれか)

ここで、これらの150の質問から15の質問があり、各質問がこれらの150の質問のプールからランダムに選択されるクイズを作成します。また、これらの15の質問はすべて一意である必要があります。ランダムな質問が出ますが、同じ質問が2つある可能性があります。

$n1=mt_Rand(1,150);

$q=mysqli_query($mysqli,"select * from quiz WHERE qno = '".$n1."'");

私もDISTINCTを使用しようとしましたが、これでも2つ以上の同じ質問が表示されます:-

$n1=mt_Rand(1,150);

$q=mysqli_query($mysqli,"select DISTINCT qno,ques,a,b,c,d,ans from quiz where qno='".$n1."' " );

私はphp言語を使用しています

1
Pankaj Agrawal

予備:これがあなたのテーブルだと思います:

CREATE TABLE questions
(
    question_number INTEGER NOT NULL PRIMARY KEY,
    question VARCHAR(255) NOT NULL, 
    answer_a VARCHAR(255) NOT NULL,
    answer_b VARCHAR(255) NOT NULL,
    answer_c VARCHAR(255) NOT NULL,
    answer_d VARCHAR(255) NOT NULL,
    right_answer ENUM ('a', 'b', 'c', 'd') NOT NULL
) ;

MySQLにハードワークを実行させ、次のSELECTステートメントを実行するだけで、すべてのテーブルをソートランダムできます(つまり、実際に行をシャッフルします)。上の5行を選択するだけです(注:簡単にするために、15ではなく5を使用しています)。

重要なポイント:PHPから乱数を生成する代わりに、データベースに乱数を処理させます...

SELECT
     question_number, question, answer_a, answer_b, answer_c, answer_d, right_answer
FROM
     questions
ORDER BY
     Rand()  
LIMIT
     5 ;

(これをPHPコードに変換するのは非常に簡単です)

次のようなものが得られます:

質問番号|質問| answer_a | answer_b | answer_c | answer_d | right_answer 
 --------------:| :-------------------------------------------------  :----------- | :----------- | :----------------- | :---------------------- | :----------- 
 2 |ホワイトハウスの色はどれですか? |黒|緑|ブルー|ホワイト| d 
 3 | 2017年現在、地球上で最も高い建物は何ですか? |エンパイアステート|ブルジュ・ハリファ|エッフェル塔|東京スカイツリー| b 
 8 | 1 kgの鉛は1 kgの羽よりも重いですか? |はい|いいえ|重力による|鳥の種類による| b 
 6 |アルファベットの3番目の文字はどれですか。 | a | b | c | d | c 
 7 |最初の母音はどれですか? | a | e |私| o | a 

同じクエリを繰り返すと、異なる一連の質問が表示されます(ただし、一部のmightはすでに尋ねられています):

質問番号|質問| answer_a | answer_b | answer_c | answer_d | right_answer 
 --------------:| :------------------------------------------------- -| :------- | :------- | :----------------- | :---------------------- | :----------- 
 9 | (人間の)原色はいくつありますか? | 3 | 2 | 6 | 4 | a 
 5 | (最も一般的な)車にはいくつの車輪がありますか? | 4 | 6 | 8 | 10 | b 
 8 | 1 kgの鉛は1 kgの羽よりも重いですか? |はい|いいえ|重力による|鳥の種類による| b 
 2 |ホワイトハウスの色はどれですか? |黒|緑|ブルー|ホワイト| d 
 6 |アルファベットの3番目の文字はどれですか。 | a | b | c | d | c 

データベースを操作するときは、通常、コードでループするのではなく、データベースに問題の完全な答えを提供させることをお勧めします。

dbfiddle ---(ここですべての設定といくつかの実行を見ることができます


参照:

3
joanolo

1から150の間の乱数を取得しているため、同じ番号を2回取得する可能性が常にあります。

そのため、理想的には、すでに出題された質問のリストを保持する必要があり、乱数を生成するたびにリストでその番号を確認する必要があります。すでに存在する場合は、それをスキップして再度乱数を生成する必要があります。

次のコードを試すことができます:

$servedQuestions = array();
while(count($servedQuestions) <= 15) {
    $n1 = mt_Rand(1,150);
    if (in_array($n1, $servedQuestions)) continue;
    $q = mysqli_query($mysqli,"select * from quiz WHERE qno = '".$n1."'");
    $servedQuestions[] = $n1;
}
0
akumar